<?xml version="1.0" encoding="UTF-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>学习笔记</title>
        <description>GitBlog是一个简单易用的Markdown博客系统</description>
        <link>https://www.syuez.com</link>
        <atom:link href="https://www.syuez.com/feed.xml" rel="self" type="application/rss+xml" />
        <pubDate>2026-05-15 10:05:34</pubDate>
        <lastBuildDate>2026-05-15 10:05:34</lastBuildDate>
        <generator>Gitblog v1.0</generator>
                <item>
            <title>STM32和7针OLED显示屏</title>
            <description>
            &lt;!--
author: admin
date: 2026-01-16
title: STM32和7针OLED显示屏
tags: stm32,oled
category: C
status: publish
summary: 初入 STM32
--&gt;
&lt;h3&gt;STM32和7针OLED显示屏&lt;/h3&gt;
&lt;p&gt;硬件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;STM32F103C8T6&lt;/li&gt;
&lt;li&gt;SSD1306 OLED 7 PIN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./img/Pasted_image_20260109095641.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里采用 &lt;strong&gt;4‑wire SPI mode&lt;/strong&gt; 在此模式下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The interface is &lt;strong&gt;write-only&lt;/strong&gt; (no data read). 只写模式&lt;/li&gt;
&lt;li&gt;Data is sent &lt;strong&gt;MSB first&lt;/strong&gt;. 数据以最高有效位(MSB)优先的方式发送&lt;/li&gt;
&lt;li&gt;Every &lt;strong&gt;8 clock pulses&lt;/strong&gt; transfer one byte. 每8个时钟脉冲传输一个字节&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;SSD1306 → STM32F103C8T6 Wiring(连线)&lt;/h4&gt;
&lt;p&gt;STM32F103选择 SPI1 全双工(Full-Duplex Master)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SSD1306 Pin&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Connect to STM32 Pin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GND&lt;/td&gt;
&lt;td&gt;Ground&lt;/td&gt;
&lt;td&gt;GND&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VDD&lt;/td&gt;
&lt;td&gt;Power Supply (3.3V logic)&lt;/td&gt;
&lt;td&gt;3.3V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCK&lt;/td&gt;
&lt;td&gt;SPI Clock&lt;/td&gt;
&lt;td&gt;PA5 (SPI1_SCK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDA&lt;/td&gt;
&lt;td&gt;Serial Data (MOSI)&lt;/td&gt;
&lt;td&gt;PA7 (SPI1_MOSI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RES&lt;/td&gt;
&lt;td&gt;Reset&lt;/td&gt;
&lt;td&gt;Any GPIO, e.g., PA0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DC&lt;/td&gt;
&lt;td&gt;Data/Command Select&lt;/td&gt;
&lt;td&gt;Any GPIO, e.g., PA1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CS&lt;/td&gt;
&lt;td&gt;Chip Select&lt;/td&gt;
&lt;td&gt;Any GPIO, e.g., PA4 (SPI1_NSS or manual control)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;不要使用5V电压（不确定，需要问硬件客服确认）&lt;/p&gt;
&lt;h4&gt;STM32CubeMX配置(configure)&lt;/h4&gt;
&lt;p&gt;Let&#039;s go step‑by‑step through the &lt;strong&gt;exact configuration process&lt;/strong&gt; to make it work reliably with your STM32F103C8T6 (Blue Pill).让我们一步步详细了解配置过程，以确保它与你的 STM32F103C8T6（蓝药丸）稳定工作。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/ae777cc5-4e22-45c9-89a6-f26cb7fce601.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Even though SSD1306 is write-only, Full Duplex is more stable on STM32 HAL&lt;/p&gt;
&lt;p&gt;PA0, PA1, PA4 都设置为&lt;code&gt;GPIO_Output&lt;/code&gt;模式，推挽输出(Output Push‑Pull)，No Pull，Low&lt;/p&gt;
&lt;p&gt;时钟配置 Keep system clock at 72 MHz (HSE + PLL). 然后点击 STM32CubeMX 中生成代码&lt;/p&gt;
&lt;h3&gt;SSD1306 原理&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;SSD1306&lt;/strong&gt; has &lt;strong&gt;GDDRAM (Graphic Display Data RAM)&lt;/strong&gt; — an internal 128 × 64 bit memory.
SSD1306 拥有 GDDRAM（图形显示数据 RAM）——一个内部 128 × 64 位的内存&lt;/p&gt;
&lt;p&gt;每一位代码一个像素，1表示开，0表示关&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Display (128x64)
↑
|  Page 7 (y = 56 to 63)
|  Page 6
|  Page 5
|  Page 4
|  Page 3
|  Page 2
|  Page 1
|  Page 0 (y = 0 to 7)
|
+---------------------------------&amp;gt; X (0–127)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;水平方向 128 位表示 128 像素，垂直方向8个分页，每页有8个像素，8×8=64，8bit=1Byte，也就是每个字节控制8个垂直像素。&lt;/p&gt;
&lt;p&gt;要显示内容需要按照以下步骤：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set the page address(0-7)&lt;/li&gt;
&lt;li&gt;Set the column address(0-127)&lt;/li&gt;
&lt;li&gt;Send data bytes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;GDDRAM 访问命令&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0xB0 + page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Select page (0–7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x00 + (column &amp;amp; 0x0F)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lower nibble of column address(低位)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x10 + ((column &amp;gt;&amp;gt; 4) &amp;amp; 0x0F)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Higher nibble of column address(高位)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OLED_WriteData(byte)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Write pixel data to screen&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;功能规格&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./img/Pasted_image_20260113100509.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是 Power up 和 Power down 的顺序图&lt;/p&gt;
&lt;h5&gt;Power up&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;Vdd 上电&lt;/li&gt;
&lt;li&gt;发送 Display off 命令&lt;/li&gt;
&lt;li&gt;初始化&lt;/li&gt;
&lt;li&gt;Clear Screen&lt;/li&gt;
&lt;li&gt;Power up Vcc(OLED内部实现)&lt;/li&gt;
&lt;li&gt;Delay 100ms&lt;/li&gt;
&lt;li&gt;Send Display on command&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Power down&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;发送 Display off 命令&lt;/li&gt;
&lt;li&gt;Vcc 下电&lt;/li&gt;
&lt;li&gt;Delay 100ms&lt;/li&gt;
&lt;li&gt;Vdd 下电&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;根据手册和时序图来实现功能
&lt;img src=&quot;./img/Pasted_image_20260115133453.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;代码部分&lt;/h3&gt;
&lt;p&gt;先声明几个函数&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_WriteCommand(uint8_t cmd);
void OLED_WriteData(uint8_t data);
void OLED_Reset(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_ClearArea(uint8_t x, uint8_t page, uint8_t width, uint8_t page_count);
void OLED_SetCursor(uint8_t x, uint8_t page);&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_WriteCommand(uint8_t cmd) {
    HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_RESET); // Command
    HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET);
    HAL_SPI_Transmit(&amp;amp;hspi1, &amp;amp;cmd, 1, HAL_MAX_DELAY);
    HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_SET);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_WriteData(uint8_t data) {
    HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_SET); // Data
    HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET);
    HAL_SPI_Transmit(&amp;amp;hspi1, &amp;amp;data, 1, HAL_MAX_DELAY);
    HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_SET);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_Reset(void) {
    HAL_GPIO_WritePin(OLED_RES_PORT, OLED_RES_PIN, GPIO_PIN_RESET);
    HAL_Delay(10);
    HAL_GPIO_WritePin(OLED_RES_PORT, OLED_RES_PIN, GPIO_PIN_SET);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;重点是初始化函数&lt;/strong&gt;，根据上面时序图设计初始化代码&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_Init(void) {
    HAL_Delay(100); // Wait for more than 100ms
    OLED_Reset(); // Hardware reset

    OLED_WriteCommand(0xAE); // Display off
    OLED_WriteCommand(0xD5); OLED_WriteCommand(0x80); // Set display clock divide ratio/oscillator frequency
    OLED_WriteCommand(0xA8); OLED_WriteCommand(0x3F); // Set multiplex ratio (1 to 64)
    OLED_WriteCommand(0xD3); OLED_WriteCommand(0x00); // Set display offset, No offset
    OLED_WriteCommand(0x40); // Set display start line to 0
    OLED_WriteCommand(0xA1); // Set segment re-map 0xA0-&amp;gt;0xA1 (mirror horizontally)    
    // OLED_WriteCommand(0x20); OLED_WriteCommand(0x00); // Memory addressing mode: horizontal    
    OLED_WriteCommand(0xC8); // Set COM scan direction (remapped mode, vertical flip)
    OLED_WriteCommand(0xDA); OLED_WriteCommand(0x12); // Set COM pins hardware configuration
    OLED_WriteCommand(0x81); OLED_WriteCommand(0x7F); // Contrast control, RESET = 7Fh
    OLED_WriteCommand(0xD9); OLED_WriteCommand(0xF1); // Set pre-charge period
    OLED_WriteCommand(0xDB); OLED_WriteCommand(0x20); // Set Vcom detect, RESET = 20h
    OLED_WriteCommand(0xA4); // Entire display ON (resume RAM content display)
    OLED_WriteCommand(0xA6); // Set Normal display (not inverted)
    OLED_WriteCommand(0x8D); OLED_WriteCommand(0x14); // Enable charge pump, Enable charge pump regulator
    HAL_Delay(100); // Power stabilized delay (recommended ~100ms)
    OLED_WriteCommand(0xAF); // Display ON
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_Clear(void)
{
    uint8_t i, j;

    for (i = 0; i &amp;lt; 8; i++)  // 8 pages total (for 64 rows)
    {
        OLED_SetCursor(0, i);
        for (j = 0; j &amp;lt; 128; j++)
        {
            OLED_WriteData(0x00);  // All pixels OFF
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_SetCursor(uint8_t x, uint8_t page)
{
    OLED_WriteCommand(0xB0 + page);              // page (0..7)
    OLED_WriteCommand(0x00 | (x &amp;amp; 0x0F));        // low column
    OLED_WriteCommand(0x10 | (x &amp;gt;&amp;gt; 4));          // high column
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，前期准备结束。下面开始在屏幕上显示内容。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;要显示字符或者字符串需要三样东西：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一个字体表【A &lt;strong&gt;font table&lt;/strong&gt; (bitmaps for each character)】&lt;/li&gt;
&lt;li&gt;一个在(x, page)处绘制单个字符的函数【A function to draw &lt;strong&gt;one character&lt;/strong&gt; at &lt;code&gt;(x, page)&lt;/code&gt;】&lt;/li&gt;
&lt;li&gt;一个通过循环调用字符函数来绘制字符串的函数&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;创建一个 6×8 的 ASCII 小字体表&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;font6x8.h&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#ifndef FONT6X8_H
#define FONT6X8_H

#include &amp;lt;stdint.h&amp;gt;

// 6x8 font, each character = 6 bytes (6 columns x 8 rows)
// Characters from ASCII 0x20 (&#039; &#039;) to 0x7E (&#039;~&#039;)
extern const uint8_t Font6x8[][6];

#endif&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;font6x8.c&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &quot;font6x8.h&quot;

// Source: classic 5x7 font extended to 6x8 (1 column spacing)
// Each entry: {col0, col1, col2, col3, col4, col5}
const uint8_t Font6x8[][6] =
{
    // ASCII 0x20 &#039; &#039;
    {0x00,0x00,0x00,0x00,0x00,0x00}, // &#039; &#039;
    {0x00,0x00,0x5F,0x00,0x00,0x00}, // &#039;!&#039;
    {0x00,0x07,0x00,0x07,0x00,0x00}, // &#039;&quot;&#039;
    {0x14,0x7F,0x14,0x7F,0x14,0x00}, // &#039;#&#039;
    {0x24,0x2A,0x7F,0x2A,0x12,0x00}, // &#039;$&#039;
    {0x23,0x13,0x08,0x64,0x62,0x00}, // &#039;%&#039;
    {0x36,0x49,0x55,0x22,0x50,0x00}, // &#039;&amp;amp;&#039;
    {0x00,0x05,0x03,0x00,0x00,0x00}, // &#039;&#039;&#039;
    {0x00,0x1C,0x22,0x41,0x00,0x00}, // &#039;(&#039;
    {0x00,0x41,0x22,0x1C,0x00,0x00}, // &#039;)&#039;
    {0x14,0x08,0x3E,0x08,0x14,0x00}, // &#039;*&#039;
    {0x08,0x08,0x3E,0x08,0x08,0x00}, // &#039;+&#039;
    {0x00,0x50,0x30,0x00,0x00,0x00}, // &#039;,&#039;
    {0x08,0x08,0x08,0x08,0x08,0x00}, // &#039;-&#039;
    {0x00,0x60,0x60,0x00,0x00,0x00}, // &#039;.&#039;
    {0x20,0x10,0x08,0x04,0x02,0x00}, // &#039;/&#039;

    {0x3E,0x51,0x49,0x45,0x3E,0x00}, // &#039;0&#039;
    {0x00,0x42,0x7F,0x40,0x00,0x00}, // &#039;1&#039;
    {0x42,0x61,0x51,0x49,0x46,0x00}, // &#039;2&#039;
    {0x21,0x41,0x45,0x4B,0x31,0x00}, // &#039;3&#039;
    {0x18,0x14,0x12,0x7F,0x10,0x00}, // &#039;4&#039;
    {0x27,0x45,0x45,0x45,0x39,0x00}, // &#039;5&#039;
    {0x3C,0x4A,0x49,0x49,0x30,0x00}, // &#039;6&#039;
    {0x01,0x71,0x09,0x05,0x03,0x00}, // &#039;7&#039;
    {0x36,0x49,0x49,0x49,0x36,0x00}, // &#039;8&#039;
    {0x06,0x49,0x49,0x29,0x1E,0x00}, // &#039;9&#039;

    {0x00,0x36,0x36,0x00,0x00,0x00}, // &#039;:&#039;
    {0x00,0x56,0x36,0x00,0x00,0x00}, // &#039;;&#039;
    {0x08,0x14,0x22,0x41,0x00,0x00}, // &#039;&amp;lt;&#039;
    {0x14,0x14,0x14,0x14,0x14,0x00}, // &#039;=&#039;
    {0x00,0x41,0x22,0x14,0x08,0x00}, // &#039;&amp;gt;&#039;
    {0x02,0x01,0x51,0x09,0x06,0x00}, // &#039;?&#039;
    {0x32,0x49,0x79,0x41,0x3E,0x00}, // &#039;@&#039;

    {0x7E,0x11,0x11,0x11,0x7E,0x00}, // &#039;A&#039;
    {0x7F,0x49,0x49,0x49,0x36,0x00}, // &#039;B&#039;
    {0x3E,0x41,0x41,0x41,0x22,0x00}, // &#039;C&#039;
    {0x7F,0x41,0x41,0x22,0x1C,0x00}, // &#039;D&#039;
    {0x7F,0x49,0x49,0x49,0x41,0x00}, // &#039;E&#039;
    {0x7F,0x09,0x09,0x09,0x01,0x00}, // &#039;F&#039;
    {0x3E,0x41,0x49,0x49,0x7A,0x00}, // &#039;G&#039;
    {0x7F,0x08,0x08,0x08,0x7F,0x00}, // &#039;H&#039;
    {0x00,0x41,0x7F,0x41,0x00,0x00}, // &#039;I&#039;
    {0x20,0x40,0x41,0x3F,0x01,0x00}, // &#039;J&#039;
    {0x7F,0x08,0x14,0x22,0x41,0x00}, // &#039;K&#039;
    {0x7F,0x40,0x40,0x40,0x40,0x00}, // &#039;L&#039;
    {0x7F,0x02,0x0C,0x02,0x7F,0x00}, // &#039;M&#039;
    {0x7F,0x04,0x08,0x10,0x7F,0x00}, // &#039;N&#039;
    {0x3E,0x41,0x41,0x41,0x3E,0x00}, // &#039;O&#039;
    {0x7F,0x09,0x09,0x09,0x06,0x00}, // &#039;P&#039;
    {0x3E,0x41,0x51,0x21,0x5E,0x00}, // &#039;Q&#039;
    {0x7F,0x09,0x19,0x29,0x46,0x00}, // &#039;R&#039;
    {0x46,0x49,0x49,0x49,0x31,0x00}, // &#039;S&#039;
    {0x01,0x01,0x7F,0x01,0x01,0x00}, // &#039;T&#039;
    {0x3F,0x40,0x40,0x40,0x3F,0x00}, // &#039;U&#039;
    {0x1F,0x20,0x40,0x20,0x1F,0x00}, // &#039;V&#039;
    {0x3F,0x40,0x38,0x40,0x3F,0x00}, // &#039;W&#039;
    {0x63,0x14,0x08,0x14,0x63,0x00}, // &#039;X&#039;
    {0x07,0x08,0x70,0x08,0x07,0x00}, // &#039;Y&#039;
    {0x61,0x51,0x49,0x45,0x43,0x00}, // &#039;Z&#039;

    {0x00,0x7F,0x41,0x41,0x00,0x00}, // &#039;[&#039;
    {0x02,0x04,0x08,0x10,0x20,0x00}, // &#039;\&#039;
    {0x00,0x41,0x41,0x7F,0x00,0x00}, // &#039;]&#039;
    {0x04,0x02,0x01,0x02,0x04,0x00}, // &#039;^&#039;
    {0x40,0x40,0x40,0x40,0x40,0x00}, // &#039;_&#039;
    {0x00,0x01,0x02,0x04,0x00,0x00}, // &#039;`&#039;

    {0x20,0x54,0x54,0x54,0x78,0x00}, // &#039;a&#039;
    {0x7F,0x48,0x44,0x44,0x38,0x00}, // &#039;b&#039;
    {0x38,0x44,0x44,0x44,0x20,0x00}, // &#039;c&#039;
    {0x38,0x44,0x44,0x48,0x7F,0x00}, // &#039;d&#039;
    {0x38,0x54,0x54,0x54,0x18,0x00}, // &#039;e&#039;
    {0x08,0x7E,0x09,0x01,0x02,0x00}, // &#039;f&#039;
    {0x0C,0x52,0x52,0x52,0x3E,0x00}, // &#039;g&#039;
    {0x7F,0x08,0x04,0x04,0x78,0x00}, // &#039;h&#039;
    {0x00,0x44,0x7D,0x40,0x00,0x00}, // &#039;i&#039;
    {0x20,0x40,0x44,0x3D,0x00,0x00}, // &#039;j&#039;
    {0x7F,0x10,0x28,0x44,0x00,0x00}, // &#039;k&#039;
    {0x00,0x41,0x7F,0x40,0x00,0x00}, // &#039;l&#039;
    {0x7C,0x04,0x18,0x04,0x78,0x00}, // &#039;m&#039;
    {0x7C,0x08,0x04,0x04,0x78,0x00}, // &#039;n&#039;
    {0x38,0x44,0x44,0x44,0x38,0x00}, // &#039;o&#039;
    {0x7C,0x14,0x14,0x14,0x08,0x00}, // &#039;p&#039;
    {0x08,0x14,0x14,0x18,0x7C,0x00}, // &#039;q&#039;
    {0x7C,0x08,0x04,0x04,0x08,0x00}, // &#039;r&#039;
    {0x48,0x54,0x54,0x54,0x20,0x00}, // &#039;s&#039;
    {0x04,0x3F,0x44,0x40,0x20,0x00}, // &#039;t&#039;
    {0x3C,0x40,0x40,0x20,0x7C,0x00}, // &#039;u&#039;
    {0x1C,0x20,0x40,0x20,0x1C,0x00}, // &#039;v&#039;
    {0x3C,0x40,0x30,0x40,0x3C,0x00}, // &#039;w&#039;
    {0x44,0x28,0x10,0x28,0x44,0x00}, // &#039;x&#039;
    {0x0C,0x50,0x50,0x50,0x3C,0x00}, // &#039;y&#039;
    {0x44,0x64,0x54,0x4C,0x44,0x00}, // &#039;z&#039;

    {0x00,0x08,0x36,0x41,0x00,0x00}, // &#039;{&#039;
    {0x00,0x00,0x7F,0x00,0x00,0x00}, // &#039;|&#039;
    {0x00,0x41,0x36,0x08,0x00,0x00}, // &#039;}&#039;
    {0x08,0x04,0x08,0x10,0x08,0x00}, // &#039;~&#039;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在你拥有了一个适用于所有可打印 ASCII 字符的单色字体。
在&lt;code&gt;oled.h&lt;/code&gt;中添加函数原型&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// New functions: 6x8
void OLED_DrawChar(uint8_t x, uint8_t page, char c);
void OLED_DrawString(uint8_t x, uint8_t page, const char *str);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;oled.c&lt;/code&gt;添加字体和函数实现&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &quot;oled.h&quot;
#include &quot;font6x8.h&quot;

// ...

void OLED_DrawChar(uint8_t x, uint8_t page, char c)
{
    // We only have printable characters 0x20..0x7E
    if ((uint8_t)c &amp;lt; 0x20 || (uint8_t)c &amp;gt; 0x7E) {
        c = &#039;?&#039;; // fallback
    }

    uint8_t index = (uint8_t)c - 0x20; // map ASCII to font index

    OLED_SetCursor(x, page);

    for (uint8_t i = 0; i &amp;lt; 6; i++) { // 6 columns per char
        OLED_WriteData(Font6x8[index][i]);
    }
}

void OLED_DrawString(uint8_t x, uint8_t page, const char *str)
{
    while (*str) {
        // If we reach right edge, go to next page (simple wrap)
        if (x &amp;gt; OLED_WIDTH - 6) {
            x = 0;
            page++;
            if (page &amp;gt;= 8) { // no more space
                break;
            }
        }

        OLED_DrawChar(x, page, *str);
        x += 6;    // move to next character position
        str++;     // next character in C string
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;main.c&lt;/code&gt;中使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_SPI1_Init();

    OLED_Init();
    OLED_Clear();

    // One character &quot;A&quot; at x=0, page=0 (top-left)
    OLED_DrawChar(0, 0, &#039;A&#039;);

    // &quot;Hello world!&quot; starting at x=0, page=1 (second text line)
    OLED_DrawString(0, 1, &quot;Hello world!&quot;);

    while (1) {
        // your loop
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成三样东西后，屏幕能够显示字符和字符串了，但是看起来字体太小了。因为 6×8 的字体就是这么小，如果要放大字体，那么需要使用更大的位图字体(bitmap font)，例如 8×16，16×16&lt;/p&gt;
&lt;h4&gt;定义 8×16 字体&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;font8x16.h&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#ifndef FONT8X16_H
#define FONT8X16_H

#include &amp;lt;stdint.h&amp;gt;

// 6x8 font, each character = 6 bytes (6 columns x 8 rows)
// Characters from ASCII 0x20 (&#039; &#039;) to 0x7E (&#039;~&#039;)
extern const uint8_t Font8x16[][16];

#endif&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;font8x16.c&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &quot;font8x16.h&quot;
// From https://github.com/datacute/Tiny4kOLED/blob/master/src/font8x16.h
const uint8_t Font8x16[][16] =
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //   0
  0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00, // ! 1
  0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // &quot; 2
  0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00, // # 3
  0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00, // $ 4
  0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00, // % 5
  0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10, // &amp;amp; 6
  0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // &#039; 7
  0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00, // ( 8
  0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00, // ) 9
  0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00, // * 10
  0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00, // + 11
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00, // , 12
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // - 13
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00, // . 14
  0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00, // / 15
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00, // 0 16
  0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, // 1 17
  0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, // 2 18
  0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, // 3 19
  0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, // 4 20
  0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, // 5 21
  0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, // 6 22
  0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, // 7 23
  0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, // 8 24
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00, // 9 25
  0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, // : 26
  0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00, // ; 27
  0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00, // &amp;lt; 28
  0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00, // = 29
  0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00, // &amp;gt; 30
  0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00, // ? 31
  0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00, // @ 32
  0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20, // A 33
  0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00, // B 34
  0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00, // C 35
  0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00, // D 36
  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00, // E 37
  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00, // F 38
  0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00, // G 39
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20, // H 40
  0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, // I 41
  0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00, // J 42
  0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00, // K 43
  0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00, // L 44
  0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00, // M 45
  0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00, // N 46
  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00, // O 47
  0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00, // P 48
  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00, // Q 49
  0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20, // R 50
  0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00, // S 51
  0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00, // T 52
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00, // U 53
  0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00, // V 54
  0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00, // W 55
  0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20, // X 56
  0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00, // Y 57
  0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00, // Z 58
  0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00, // [ 59
  0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00, // \ 60
  0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00, // ] 61
  0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ^ 62
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, // _ 63
  0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ` 64
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20, // a 65
  0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00, // b 66
  0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00, // c 67
  0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20, // d 68
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00, // e 69
  0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, // f 70
  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00, // g 71
  0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20, // h 72
  0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, // i 73
  0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00, // j 74
  0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00, // k 75
  0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, // l 76
  0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F, // m 77
  0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20, // n 78
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00, // o 79
  0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00, // p 80
  0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80, // q 81
  0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00, // r 82
  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00, // s 83
  0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00, // t 84
  0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20, // u 85
  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00, // v 86
  0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00, // w 87
  0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00, // x 88
  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00, // y 89
  0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00, // z 90
  0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40, // { 91
  0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, // | 92
  0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00, // } 93
  0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ~ 94
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加绘制 8×16 的函数 &lt;code&gt;oled.h&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// New: 8x16 font 
void OLED_DrawChar16(uint8_t x, uint8_t page, char c); 
void OLED_DrawString16(uint8_t x, uint8_t page, const char *str);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;oled.c&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_DrawChar16(uint8_t x, uint8_t page, char c)
{
    // A 16-pixel tall char needs two pages: page and page+1.
    if (page &amp;gt;= 7) {
        // No room for bottom half if page is 7
        return;
    }

    if ((uint8_t)c &amp;lt; 0x20 || (uint8_t)c &amp;gt; 0x7E) {
        c = &#039;?&#039;;  // fallback character
    }

    uint8_t index = (uint8_t)c - 0x20;

    // Top 8 rows (page)
    OLED_SetCursor(x, page);
    for (uint8_t col = 0; col &amp;lt; 8; col++) {
        OLED_WriteData(Font8x16[index][col]);     // bytes 0..7
    }

    // Bottom 8 rows (page + 1)
    OLED_SetCursor(x, page + 1);
    for (uint8_t col = 0; col &amp;lt; 8; col++) {
        OLED_WriteData(Font8x16[index][col + 8]); // bytes 8..15
    }

    // Optional: add 1-pixel spacing column
    OLED_SetCursor(x + 8, page);
    OLED_WriteData(0x00);
    OLED_SetCursor(x + 8, page + 1);
    OLED_WriteData(0x00);
}

void OLED_DrawString16(uint8_t x, uint8_t page, const char *str)
{
    while (*str) {
        // Each character uses 9 px in width (8 + 1 spacing)
        if (x &amp;gt; OLED_WIDTH - 9) {
            x = 0;
            page += 2;     // Move down by 2 pages (16 pixels)
            if (page &amp;gt;= 7) // No more vertical space
                break;
        }

        OLED_DrawChar16(x, page, *str);
        x += 9;   // move to next character position
        str++;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在 &lt;code&gt;main.c&lt;/code&gt;中添加&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_SPI1_Init();

    OLED_Init();
    OLED_Clear();

    // Small text (6x8)
    OLED_DrawString(0, 0, &quot;Small text&quot;);

    // Big text (8x16) starting at top pages 2 &amp;amp; 3
    OLED_DrawString16(0, 2, &quot;Hello&quot;);

    while (1) { }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;英文字符串已经完成。接下来需要显示中文。&lt;/p&gt;
&lt;p&gt;首先，使用&lt;strong&gt;PCtoLCD2002&lt;/strong&gt; 获取所要显示的汉字的C数组，比如&amp;quot;你好世界&amp;quot;这四个字&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;{0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00},
{0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00},/*&quot;你&quot;,0*/
{0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00},
{0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00},/*&quot;好&quot;,1*/
{0x20,0x20,0x20,0xFE,0x20,0x20,0xFF,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00},
{0x00,0x00,0x00,0x7F,0x40,0x40,0x47,0x44,0x44,0x44,0x47,0x40,0x40,0x40,0x00,0x00},/*&quot;世&quot;,2*/
{0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00},
{0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00},/*&quot;界&quot;,3*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PCtoLCD2002 生成的每个汉字提供 32 字节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一组 16 字节 → 顶部 8 行（页面 &lt;code&gt;P&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;第二组 16 字节 → 底部 8 行（页面 &lt;code&gt;P+1&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;16 列宽&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;16×16 字体&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;font16x16.h&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#ifndef FONT16X16_H
#define FONT16X16_H

#include &amp;lt;stdint.h&amp;gt;

// Each entry = 16 bytes; two entries per Chinese character (top + bottom)
extern const uint8_t Font16x16[][16];

// Optional: readable indices for each character
#define CHN_NI     0  // &quot;你&quot;
#define CHN_HAO    1  // &quot;好&quot;
#define CHN_SHI    2  // &quot;世&quot;
#define CHN_JIE    3  // &quot;界&quot;

#endif&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;font16x16.c&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &quot;font16x16.h&quot;

const uint8_t Font16x16[][16] =
{
    {0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00},
    {0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00},/*&quot;你&quot;,0*/

    {0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00},
    {0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00},/*&quot;好&quot;,1*/

    {0x20,0x20,0x20,0xFE,0x20,0x20,0xFF,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00},
    {0x00,0x00,0x00,0x7F,0x40,0x40,0x47,0x44,0x44,0x44,0x47,0x40,0x40,0x40,0x00,0x00},/*&quot;世&quot;,2*/

    {0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00},
    {0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00},/*&quot;界&quot;,3*/
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;定义绘制汉字的函数 &lt;code&gt;oled.h&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_DrawChinese(uint8_t x, uint8_t page, uint8_t index);
void OLED_DrawChineseString(uint8_t x, uint8_t page, const uint8_t *idx, uint8_t len);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;oled.c&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void OLED_DrawChinese(uint8_t x, uint8_t page, uint8_t index)
{
    // A 16-pixel-high character uses 2 pages: page and page+1
    if (page &amp;gt;= 7) {
        // No room for bottom half
        return;
    }

    // Two 16-byte blocks per character
    uint8_t topIdx    = index * 2;
    uint8_t bottomIdx = index * 2 + 1;

    // Optional bounds check (if you know how many characters you have):
    // uint8_t totalBlocks = sizeof(Font16x16) / 16;
    // if (bottomIdx &amp;gt;= totalBlocks) return;

    // Top 8 rows
    OLED_SetCursor(x, page);
    for (uint8_t col = 0; col &amp;lt; 16; col++) {
        OLED_WriteData(Font16x16[topIdx][col]);
    }

    // Bottom 8 rows
    OLED_SetCursor(x, page + 1);
    for (uint8_t col = 0; col &amp;lt; 16; col++) {
        OLED_WriteData(Font16x16[bottomIdx][col]);
    }
}

void OLED_DrawChineseString(uint8_t x, uint8_t page, const uint8_t *idx, uint8_t len)
{
    for (uint8_t i = 0; i &amp;lt; len; i++) {
        if (x &amp;gt; OLED_WIDTH - 16) {
            x = 0;
            page += 2;  // 16 pixels down (2 pages)
            if (page &amp;gt;= 7) {
                return;  // no more space
            }
        }

        OLED_DrawChinese(x, page, idx[i]);
        x += 16;   // move right by 16 pixels (no extra gap)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;main.c&lt;/code&gt;中显示汉字&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &quot;oled.h&quot;
#include &quot;font16x16.h&quot;

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_SPI1_Init();

    OLED_Init();
    OLED_Clear();

    // Optional: show some English text
    OLED_DrawString(0, 0, &quot;Hello&quot;);

    // Chinese &quot;你好世界&quot;
    uint8_t hello_cn[] = { CHN_NI, CHN_HAO, CHN_SHI, CHN_JIE };

    // Start at x=0, page=2 (so characters are not at very top)
    OLED_DrawChineseString(0, 2, hello_cn, 4);

    while (1) {
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;最后，显示图片和动画。其实动画就是一帧一帧的图片播放。SSD1306只能使用单色位图(monochrome bitmap)&lt;/p&gt;
&lt;p&gt;首先需要128×64的图片，然后通过&lt;code&gt;Img2Lcd&lt;/code&gt;将图片转换成单色的BMP格式，也就是1bit bmp图片，然后通过下面的C代码转换成C数组，这就是一帧的图片&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;

#define OLED_WIDTH   128
#define OLED_HEIGHT  64
#define OLED_BYTES   (OLED_WIDTH * OLED_HEIGHT / 8)

#pragma pack(push, 1)
typedef struct {
    uint16_t bfType;      // &#039;BM&#039;
    uint32_t bfSize;
    uint16_t bfReserved1;
    uint16_t bfReserved2;
    uint32_t bfOffBits;   // offset to pixel data
} BITMAPFILEHEADER;

typedef struct {
    uint32_t biSize;      // header size (40)
    int32_t  biWidth;
    int32_t  biHeight;
    uint16_t biPlanes;
    uint16_t biBitCount;
    uint32_t biCompression;
    uint32_t biSizeImage;
    int32_t  biXPelsPerMeter;
    int32_t  biYPelsPerMeter;
    uint32_t biClrUsed;
    uint32_t biClrImportant;
} BITMAPINFOHEADER;
#pragma pack(pop)

int main(int argc, char *argv[])
{
    if (argc != 3) {
        printf(&quot;Usage: %s &amp;lt;source.bmp&amp;gt; &amp;lt;target.h&amp;gt;\n&quot;, argv[0]);
        return 1;
    }

    const char *inName  = argv[1];
    const char *outName = argv[2];

    FILE *in = fopen(inName, &quot;rb&quot;);
    if (!in) {
        perror(&quot;fopen input&quot;);
        return 1;
    }

    BITMAPFILEHEADER bfh;
    BITMAPINFOHEADER bih;

    fread(&amp;amp;bfh, sizeof(bfh), 1, in);
    fread(&amp;amp;bih, sizeof(bih), 1, in);

    if (bfh.bfType != 0x4D42) {    // &#039;BM&#039;
        fprintf(stderr, &quot;Not a BMP file\n&quot;);
        return 1;
    }
    if (bih.biBitCount != 1) {
        fprintf(stderr, &quot;Only 1-bit BMP supported (got %d bpp)\n&quot;, bih.biBitCount);
        return 1;
    }
    if (bih.biWidth != OLED_WIDTH || abs(bih.biHeight) != OLED_HEIGHT) {
        fprintf(stderr, &quot;BMP must be %dx%d (got %dx%d)\n&quot;,
                OLED_WIDTH, OLED_HEIGHT, bih.biWidth, bih.biHeight);
        return 1;
    }

    // BMP rows: each row padded to 4-byte boundary
    int rowBytes = ((bih.biWidth + 31) / 32) * 4;   // for 1 bpp: ceil(width/32)*4
    int height   = abs(bih.biHeight);
    int topDown  = (bih.biHeight &amp;lt; 0);              // rarely used, but handle

    // Read full pixel data
    uint8_t *bmp = (uint8_t *)malloc(rowBytes * height);
    if (!bmp) {
        fprintf(stderr, &quot;Out of memory\n&quot;);
        return 1;
    }

    fseek(in, bfh.bfOffBits, SEEK_SET);
    fread(bmp, 1, rowBytes * height, in);
    fclose(in);

    // Convert to SSD1306 format: pages (8 rows) × columns
    uint8_t oled[OLED_BYTES];

    for (int page = 0; page &amp;lt; OLED_HEIGHT / 8; page++) {
        for (int x = 0; x &amp;lt; OLED_WIDTH; x++) {
            uint8_t byte = 0;
            for (int bit = 0; bit &amp;lt; 8; bit++) {
                int y = page * 8 + bit;

                int bmpY = topDown ? y : (height - 1 - y); // BMP is usually bottom-up
                int bmpX = x;

                int rowOffset  = bmpY * rowBytes;
                int byteIndex  = rowOffset + (bmpX / 8);
                uint8_t mask   = 0x80 &amp;gt;&amp;gt; (bmpX &amp;amp; 7);  // leftmost pixel is MSB

                int pixelOn = (bmp[byteIndex] &amp;amp; mask) ? 1 : 0;

                if (pixelOn) {
                    byte |= (1 &amp;lt;&amp;lt; bit);  // bit0=top, bit7=bottom
                }
            }
            oled[page * OLED_WIDTH + x] = byte;
        }
    }

    free(bmp);

    // Write out as C array
    FILE *out = fopen(outName, &quot;w&quot;);
    if (!out) {
        perror(&quot;fopen output&quot;);
        return 1;
    }

    fprintf(out, &quot;const unsigned char img_data[%d] = {\n&quot;, OLED_BYTES);

    for (int i = 0; i &amp;lt; OLED_BYTES; i++) {
        fprintf(out, &quot;0x%02X,&quot;, oled[i]);
        if ((i % 16) == 15) fprintf(out, &quot;\n&quot;);
    }

    fprintf(out, &quot;};\n&quot;);
    fclose(out);

    printf(&quot;Converted %s -&amp;gt; %s OK\n&quot;, inName, outName);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后编译&lt;code&gt;gcc converter.c -o converter&lt;/code&gt;
运行&lt;code&gt;converter.exe input.bmp output.h&lt;/code&gt;
&lt;code&gt;output.h&lt;/code&gt; 就是一帧图片，然后显示出来&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &quot;output.h&quot;  // contains const unsigned char img_data[1024];

void ShowImage(void)
{
    uint8_t page, x;
    const uint8_t *p = img_data;

    for (page = 0; page &amp;lt; 8; page++) {
        OLED_SetCursor(0, page);
        for (x = 0; x &amp;lt; 128; x++) {
            OLED_WriteData(*p++);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;显示动画&lt;/h5&gt;
&lt;p&gt;创建&lt;code&gt;frames.h&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* frames.h  –  ALL animation frame data in one place */
#ifndef FRAMES_H
#define FRAMES_H

#define FRAME_WIDTH        128
#define FRAME_HEIGHT       64
#define FRAME_SIZE         (FRAME_WIDTH * FRAME_HEIGHT / 8)   // 1024
#define ANIM_FRAME_COUNT   12    // change if you have more/less frames

/* ---- Frame data (paste converter output here) ---- */

/* Example: frame 0 */
const unsigned char frame0[FRAME_SIZE] = {
    /* paste converter output for picture 0 here, rename to frame0 */
};

/* frame 1 */
const unsigned char frame1[FRAME_SIZE] = {
    /* frame 1 data */
};

/* ... repeat for all frames ... */

const unsigned char frame11[FRAME_SIZE] = {
    /* frame 11 data */
};

/* ---- Pointer table to frames ---- */
const unsigned char* const AnimFrames[ANIM_FRAME_COUNT] =
{
    frame0,
    frame1,
    frame2,
    frame3,
    frame4,
    frame5,
    frame6,
    frame7,
    frame8,
    frame9,
    frame10,
    frame11
};

#endif /* FRAMES_H */&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;oled.h&lt;/code&gt;添加绘图 API&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* New: draw a bitmap already in SSD1306 page format */
void OLED_DrawBitmap(uint8_t x, uint8_t page, uint8_t width, uint8_t height, const unsigned char *bmp);
void PlayAnimation(void);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;oled.c&lt;/code&gt;实现&lt;code&gt;OLED_DrawBitmap&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_DrawBitmap(uint8_t x,
                     uint8_t page,
                     uint8_t width,
                     uint8_t height,
                     const unsigned char *bmp)
{
    uint8_t pages = height / 8;

    for (uint8_t p = 0; p &amp;lt; pages; ++p)
    {
        OLED_SetCursor(x, page + p);

        for (uint8_t col = 0; col &amp;lt; width; ++col)
        {
            OLED_WriteData(*bmp++);
        }
    }
}

void PlayAnimation(void)
{
    const uint16_t frameDelayMs = 200;  // adjust speed

    while (1)
    {
        for (uint8_t i = 0; i &amp;lt; ANIM_FRAME_COUNT; ++i)
        {
            OLED_DrawBitmap(
                0,                 // x
                0,                 // page
                FRAME_WIDTH,       // 128
                FRAME_HEIGHT,      // 64
                AnimFrames[i]);    // const unsigned char*

            HAL_Delay(frameDelayMs);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;main.c&lt;/code&gt;中测试&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &quot;main.h&quot;
#include &quot;oled.h&quot;
#include &quot;frames.h&quot;

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_SPI1_Init();

    OLED_Init();
    OLED_Clear();

    PlayAnimation();   // loop forever

    while (1)
    {
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;总结：&lt;/p&gt;
&lt;p&gt;Here&#039;s a clean recap of the whole journey, ignoring all the side mistakes and focusing only on:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From: show characters&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;To: show full‑screen animation&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1. How text/characters are usually drawn on the OLED&lt;/h3&gt;
&lt;h4&gt;1.1. Display basics&lt;/h4&gt;
&lt;p&gt;Your 128×64 SSD1306‑type OLED is organized in &lt;strong&gt;pages&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Width: 128 pixels → x = 0…127&lt;/li&gt;
&lt;li&gt;Height: 64 pixels, grouped in 8‑pixel‑high pages → page = 0…7&lt;/li&gt;
&lt;li&gt;Each byte = vertical column of 8 pixels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So for a full screen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;128 (columns) × 8 (pages) = 1024 bytes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2. Text drawing flow&lt;/h4&gt;
&lt;p&gt;Typical “show character” code does something like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_SetCursor(uint8_t x, uint8_t page);  // set column and page
void OLED_WriteData(uint8_t data);             // send one byte to display&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For a font (say 8×16) you have:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;const uint8_t Font8x16[][16] = { /* font data */ };&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To draw a character:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Look up its bytes in the font table.&lt;/li&gt;
&lt;li&gt;Position the cursor (&lt;code&gt;OLED_SetCursor(x, page)&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Write out that character’s bytes with &lt;code&gt;OLED_WriteData(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Maybe two pages if height is 16: page &lt;code&gt;p&lt;/code&gt; and &lt;code&gt;p+1&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So the “show character” pipeline is:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Font data → bytes in RAM/flash → &lt;code&gt;OLED_WriteData(...)&lt;/code&gt; → pixels on screen&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2. Extending that idea to images / bitmaps&lt;/h3&gt;
&lt;p&gt;Animation frames are &lt;strong&gt;just big bitmaps&lt;/strong&gt; instead of small font glyphs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One frame covers all 128×64 pixels.&lt;/li&gt;
&lt;li&gt;Size = 128 × 64 / 8 = 1024 bytes.&lt;/li&gt;
&lt;li&gt;Layout: same page format as the OLED expects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So we build a generic helper:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void OLED_DrawBitmap(uint8_t x,
                     uint8_t page,
                     uint8_t width,
                     uint8_t height,
                     const unsigned char *bmp)
{
    uint8_t pages = height / 8;

    for (uint8_t p = 0; p &amp;lt; pages; ++p)
    {
        OLED_SetCursor(x, page + p);         // select current page

        for (uint8_t col = 0; col &amp;lt; width; ++col)
        {
            OLED_WriteData(*bmp++);          // send next byte
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Conceptually it’s the same as drawing a big font character:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You start at a position.&lt;/li&gt;
&lt;li&gt;You stream bytes one by one.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;3. Preparing frame data with the converter&lt;/h3&gt;
&lt;p&gt;Your &lt;strong&gt;new converter&lt;/strong&gt; takes a BMP (128×64) and outputs data already in &lt;strong&gt;page order&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;const unsigned char img_data[1024] = {
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, ...
    /* 1024 bytes total */
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This matches exactly what &lt;code&gt;OLED_DrawBitmap&lt;/code&gt; expects. So there is no extra rearranging needed.&lt;/p&gt;
&lt;p&gt;For animation, you simply generate multiple such arrays, one per frame.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4. Putting all frames into one header: &lt;code&gt;frames.h&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;You decided to keep everything in one file, which is fine.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;For each frame’s output from the converter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the name from &lt;code&gt;img_data&lt;/code&gt; to &lt;code&gt;frame0&lt;/code&gt;, &lt;code&gt;frame1&lt;/code&gt;, …&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Put them all in &lt;code&gt;frames.h&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* frames.h */
#ifndef FRAMES_H
#define FRAMES_H

#define FRAME_WIDTH        128
#define FRAME_HEIGHT       64
#define FRAME_SIZE         1024       // 128*64/8
#define ANIM_FRAME_COUNT   N          // number of frames

/* Frame 0 */
const unsigned char frame0[FRAME_SIZE] = {
    /* 1024 bytes from converter */
};

/* Frame 1 */
const unsigned char frame1[FRAME_SIZE] = {
    /* another 1024 bytes */
};

/* ... more frames ... */

/* Pointer table */
const unsigned char* const AnimFrames[ANIM_FRAME_COUNT] = {
    frame0,
    frame1,
    /* frame2, frame3, ... */
};

#endif&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Key rule:&lt;/strong&gt; Only &lt;code&gt;animation.c&lt;/code&gt; includes &lt;code&gt;frames.h&lt;/code&gt; to avoid multiple-definition link errors.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5. The animation driver: &lt;code&gt;PlayAnimation(void)&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;PlayAnimation&lt;/code&gt; just:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Loops over each frame pointer in &lt;code&gt;AnimFrames[]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Calls &lt;code&gt;OLED_DrawBitmap(...)&lt;/code&gt; to draw that frame.&lt;/li&gt;
&lt;li&gt;Waits a short delay (&lt;code&gt;HAL_Delay&lt;/code&gt;) for animation speed.&lt;/li&gt;
&lt;li&gt;Repeats forever (or once, depending on your design).&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* animation.c */
#include &quot;stm32f1xx_hal.h&quot;
#include &quot;oled.h&quot;
#include &quot;frames.h&quot;
#include &quot;animation.h&quot;

void PlayAnimation(void)
{
    const uint16_t frameDelayMs = 75;  // animation speed

    while (1)
    {
        for (uint8_t i = 0; i &amp;lt; ANIM_FRAME_COUNT; ++i)
        {
            OLED_DrawBitmap(
                0,                 // x start
                0,                 // top page
                FRAME_WIDTH,       // 128
                FRAME_HEIGHT,      // 64
                AnimFrames[i]);    // frame pointer

            HAL_Delay(frameDelayMs);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So the “show animation” pipeline is:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frame arrays (flash) → &lt;code&gt;AnimFrames[]&lt;/code&gt; → &lt;code&gt;OLED_DrawBitmap&lt;/code&gt; → &lt;code&gt;OLED_WriteData&lt;/code&gt; → OLED&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Same idea as text, just more bytes and multiple frames.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;6. Integration in &lt;code&gt;main.c&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Once OLED and HAL are initialized, you simply hand control to &lt;code&gt;PlayAnimation()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &quot;oled.h&quot;
#include &quot;animation.h&quot;

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_SPI1_Init();

    OLED_Init();
    OLED_Clear();

    PlayAnimation();     // never returns; displays animation

    while (1)
    {
        // not reached in this design
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;7. Conceptual summary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Show characters&lt;/strong&gt; = draw small bitmaps (font glyphs) at different x/page positions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Show one static image&lt;/strong&gt; = draw one big bitmap (128×64) with &lt;code&gt;OLED_DrawBitmap&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Show animation&lt;/strong&gt; = draw a sequence of big bitmaps stored as &lt;code&gt;frameN[]&lt;/code&gt; arrays, with a delay between each.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nothing fundamentally changes in how the OLED is driven; you just changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Source of bytes&lt;/strong&gt;: font → frame arrays.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amount of data&lt;/strong&gt;: a few bytes per character → 1024 bytes per frame.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timing&lt;/strong&gt;: added a delay loop to create motion.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Create this tutorial with GPT-5.1&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/STM32%E5%92%8C7%E9%92%88OLED%E6%98%BE%E7%A4%BA%E5%B1%8F.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/STM32%E5%92%8C7%E9%92%88OLED%E6%98%BE%E7%A4%BA%E5%B1%8F.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>STM32串口和DMA</title>
            <description>
            &lt;!--
author: admin
date: 2025-12-17
title: STM32串口和DMA
tags: stm32,DMA,串口
category: C
status: publish
summary: 初入 STM32
--&gt;
&lt;p&gt;如果是没有开启 DMA 功能则可以参考: &lt;a href=&quot;https://www.syuez.com/blog/STM32%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1%E5%AE%9E%E9%AA%8C.html&quot;&gt;STM32串口通信实验&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最大的区别是开启 DMA，如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/Pasted-image-20251217145312.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;index_files/b72a22f0-0218-4c62-818f-cdebb448f45b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后由 STM32CubeMX 生成代码&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;usart.h&lt;/code&gt;中添加&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* USER CODE BEGIN Includes */

#include &quot;stdio.h&quot;
#include &quot;stdint.h&quot;

/* USER CODE END Includes */
...
/* USER CODE BEGIN Prototypes */

#define UART_TX_BUF_SIZE 256    // Size of the ring buffer

void UART_Printf_Init(UART_HandleTypeDef *huart);

/* USER CODE END Prototypes */
...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;usart.c&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* USER CODE BEGIN 0 */

static UART_HandleTypeDef *debug_uart = NULL;

static uint8_t  uart_tx_buf[UART_TX_BUF_SIZE];
static volatile uint16_t uart_tx_head = 0;  // next write position
static volatile uint16_t uart_tx_tail = 0;  // next read position
static volatile uint8_t  uart_tx_busy = 0;  // DMA currently running?

static void UART_StartTxDMA(void)
{
    if (debug_uart == NULL) return;

    // Nothing to send?
    if (uart_tx_head == uart_tx_tail) {
        uart_tx_busy = 0;
        return;
    }

    uart_tx_busy = 1;

    uint16_t tail = uart_tx_tail;
    uint16_t head = uart_tx_head;
    uint16_t len;

    if (head &amp;gt; tail) {
        // Continuous region
        len = head - tail;
    } else {
        // Wrap-around: send from tail to end of buffer
        len = UART_TX_BUF_SIZE - tail;
    }

    if (HAL_UART_Transmit_DMA(debug_uart, &amp;amp;uart_tx_buf[tail], len) != HAL_OK)
    {
        // If DMA failed to start, clear the busy flag so we can try again
        uart_tx_busy = 0;
    }
}

static void UART_BufferWrite(const uint8_t *data, uint16_t len)
{
    for (uint16_t i = 0; i &amp;lt; len; i++) {
        uint16_t next_head = (uart_tx_head + 1) % UART_TX_BUF_SIZE;

        // If buffer full: either block, drop, or overwrite.
        // Here we simply block until space is available.
        while (next_head == uart_tx_tail) {
            // Buffer full – wait (simple version; could yield, etc.)
        }

        uart_tx_buf[uart_tx_head] = data[i];
        uart_tx_head = next_head;
    }

    // Start DMA if not running
    __disable_irq();               // short critical section
    if (!uart_tx_busy) {
        UART_StartTxDMA();
    }
    __enable_irq();
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart == debug_uart) {
        uint16_t sent = huart-&amp;gt;TxXferSize; // number of bytes just sent

        uart_tx_tail = (uart_tx_tail + sent) % UART_TX_BUF_SIZE;

        if (uart_tx_head != uart_tx_tail) {
            // More data pending – start next chunk
            UART_StartTxDMA();
        } else {
            uart_tx_busy = 0; // Buffer empty
        }
    }
}

void UART_Printf_Init(UART_HandleTypeDef *huart)
{
    debug_uart = huart;
}

int fputc(int ch, FILE *f)
{
    uint8_t c = (uint8_t)ch;

    if (debug_uart == NULL) {
        return ch;   // or EOF
    }

    UART_BufferWrite(&amp;amp;c, 1);
    return ch;
}

/* USER CODE END 0 */&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;main.c&lt;/code&gt;中添加&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  UART_Printf_Init(&amp;amp;huart1);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

    printf(&quot;Hello DMA UART\r\n&quot;);
    HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;这里最大的疑惑是为什么使用 DMA 后还需要 UART 中断？最开始 GPT-5.1 给我的方案也是没有开启 UART 中断的，结果串口只接到一个字符 &amp;quot;H&amp;quot;。&lt;/p&gt;
&lt;p&gt;后来问了 Gemini-3-Pro 后，它告诉我还是需要开启 UART 中断。以下的它的一些回应：&lt;/p&gt;
&lt;p&gt;If you use the STM32 HAL library, the UART Interrupt is mandatory even if you are using DMA.
如果你使用 STM32 HAL 库，即使启用了 DMA，UART 中断也是必需的。&lt;/p&gt;
&lt;p&gt;You might think: &lt;em&gt;&amp;quot;If the DMA moves the data, why do I need the UART interrupt?&amp;quot;&lt;/em&gt;
你可能会想：&lt;em&gt;&amp;quot;既然 DMA 负责移动数据，为什么还需要 UART 中断呢？&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a specific design choice in the &lt;strong&gt;STM32 HAL Library&lt;/strong&gt;. Here is the sequence of events when you call &lt;code&gt;HAL_UART_Transmit_DMA&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DMA Transfer:&lt;/strong&gt; The DMA moves data from your RAM to the UART Data Register.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DMA Complete:&lt;/strong&gt; When the DMA finishes moving the last byte, the &lt;strong&gt;DMA Interrupt&lt;/strong&gt; fires (&lt;code&gt;DMA1_Channel4_IRQHandler&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The HAL Logic:&lt;/strong&gt; Inside the DMA interrupt, the HAL library thinks: &lt;em&gt;&amp;quot;Okay, I moved all the data to the UART, but the UART hardware is still shifting the last byte out onto the wire. I cannot say the transaction is &#039;Complete&#039; yet.&amp;quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enabling UART IT:&lt;/strong&gt; Consequently, the HAL library &lt;strong&gt;enables the UART Transmission Complete (TC) Interrupt&lt;/strong&gt; inside the DMA Interrupt handler.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UART Complete:&lt;/strong&gt; When the final bit leaves the TX pin, the &lt;strong&gt;UART Interrupt&lt;/strong&gt; fires (&lt;code&gt;USART1_IRQHandler&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cleanup:&lt;/strong&gt; Only inside this UART interrupt does the HAL set the handle state to &lt;code&gt;Ready&lt;/code&gt; and call your &lt;code&gt;HAL_UART_TxCpltCallback&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;If you do not enable &lt;code&gt;USART1_IRQHandler&lt;/code&gt;:&lt;/strong&gt;&lt;br /&gt;
The DMA finishes, enables the UART interrupt, and then... nothing happens. The CPU never jumps to the cleanup code. The UART handle remains in &lt;code&gt;HAL_UART_STATE_BUSY_TX&lt;/code&gt; forever. That is why you only saw one &amp;quot;h&amp;quot; (the buffer filled up, sent once, and never cleared the busy flag).&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;a href=&quot;https://www.steppeschool.com/blog/stm32-uart-polling-dma&quot;&gt;STM32 UART: Polling and DMA modes using HAL API&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/STM32%E4%B8%B2%E5%8F%A3%E5%92%8CDMA.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/STM32%E4%B8%B2%E5%8F%A3%E5%92%8CDMA.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>STM32使用按键控制LED实验</title>
            <description>
            &lt;!--
author: admin
date: 2025-04-19
title: STM32使用按键控制LED实验
tags: LED,按键输入
category: C
status: publish
summary: 初入 STM32
--&gt;
&lt;h1&gt;STM32使用按键控制LED实验&lt;/h1&gt;
&lt;p&gt;本次实验硬件：STM32F103C8T6核心板，按键(微动开关)，面包板。&lt;/p&gt;
&lt;p&gt;根据原理图可知，LED对应的引脚是PC13，且LED已接 3.3V 电源，如果PC13设置为推挽输出(Push-Pull Output)，那么当PC13引脚输出高电平时LED灯熄灭，PC13输出低电平时LED点亮。如果PC13设置为开漏输出，如果我们控制输出为0，低电平，LED点亮，如果控制输出为1，那么引脚既不输出高电平，也不输出低电平，可以视为一个高电阻。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/7d096d6e-8a4e-4353-ac88-5a710cd934ac.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里选择推挽输出。&lt;/p&gt;
&lt;p&gt;在STM32CubeMX中配置PC13：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/9205fe9a-3eb1-46c5-9d6f-0d481e9bc27b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用PA11引脚连接按键开关，设置为GPIO输入模式。&lt;/p&gt;
&lt;p&gt;STM32的GPIO有&lt;strong&gt;浮空输入&lt;/strong&gt;（Floating Input）、&lt;strong&gt;上拉输入&lt;/strong&gt;（Input Pull-up）、&lt;strong&gt;下拉输入&lt;/strong&gt;（Input Pull-down）和&lt;strong&gt;模拟输入&lt;/strong&gt;（Analog Input）&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模式&lt;/th&gt;
&lt;th&gt;内部电阻&lt;/th&gt;
&lt;th&gt;电平默认状态&lt;/th&gt;
&lt;th&gt;典型应用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;浮空输入&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;悬空&lt;/td&gt;
&lt;td&gt;外部明确驱动（如I2C）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;上拉输入&lt;/td&gt;
&lt;td&gt;上拉&lt;/td&gt;
&lt;td&gt;高电平&lt;/td&gt;
&lt;td&gt;按键接地触发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下拉输入&lt;/td&gt;
&lt;td&gt;下拉&lt;/td&gt;
&lt;td&gt;低电平&lt;/td&gt;
&lt;td&gt;按键接电源触发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模拟输入&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;ADC/DAC信号输入&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;index_files/3791d1d0-c0cd-45c3-9188-d26f2b214170.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;根据原理图，按键接地触发，选择上拉输入。&lt;/p&gt;
&lt;p&gt;在STM32CubeMX中配置PA11：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/2253d298-5017-4166-b964-312b9beb35c8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;由于内部上拉电阻的原因，现在PA11默认是高电平，当按键开关按下后，因为接地原因，PA11会变成低电平。&lt;/p&gt;
&lt;p&gt;完成配置后生成代码。&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;gpio.c&lt;/code&gt;中看到GPIO的初始化&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &amp;amp;GPIO_InitStruct);

  /*Configure GPIO pin : PA11 */
  GPIO_InitStruct.Pin = GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &amp;amp;GPIO_InitStruct);

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);&lt;/code&gt;被默认设置为高电平，如果你在这里修改为低电平，将代码导入主板后，LED灯默认是点亮的。&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;main.c&lt;/code&gt;中添加代码&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_RESET)
        {
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
        }
        else
        {
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
        }
  }
  /* USER CODE END 3 */&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_RESET)&lt;/code&gt;判断PA11是否是低电平，即按键是否被按下，如果是低电平则通过&lt;code&gt;HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);&lt;/code&gt;将PC13设置为低电平。&lt;/p&gt;
&lt;p&gt;编译并导入代码。按下按键后LED点亮，松开按键后LED灯熄灭。&lt;/p&gt;
&lt;p&gt;如果我们将上面的&lt;code&gt;if&lt;/code&gt;语句修改成&lt;code&gt;if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_SET)&lt;/code&gt;，即如果PA11是高电平，那么LED点亮。编译导入，运行代码，即可发现LED默认是点亮的，按下按键后，PA11变成低电平，LED熄灭，松开按键后LED点亮。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/STM32%E4%BD%BF%E7%94%A8%E6%8C%89%E9%94%AE%E6%8E%A7%E5%88%B6LED%E5%AE%9E%E9%AA%8C.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/STM32%E4%BD%BF%E7%94%A8%E6%8C%89%E9%94%AE%E6%8E%A7%E5%88%B6LED%E5%AE%9E%E9%AA%8C.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>STM32使用DMA控制脉冲数量</title>
            <description>
            &lt;!--
author: admin
date: 2025-04-10
title: STM32使用DMA控制脉冲数量
tags: PWM,DMA
category: C
status: publish
summary: 初入 STM32
--&gt;
&lt;h1&gt;STM32使用DMA控制脉冲数量&lt;/h1&gt;
&lt;p&gt;在控制步进电机的时候往往需要控制输出的脉冲数量。本文使用&lt;code&gt;DMA&lt;/code&gt;来实现&lt;code&gt;PWM&lt;/code&gt;数量。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在STM32CubeMX中配置&lt;code&gt;TIM1&lt;/code&gt;定时器&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;index_files/fcb3ee66-7bfc-44ec-ae05-cc9e627dd958.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;配置DMA，设置为&lt;code&gt;Memory to Peripheral&lt;/code&gt;，数据宽度：Half-word（16-bit），模式：Normal（一次性）或 Circular（循环），其他默认。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;index_files/428a8126-5841-41dc-88a5-e074ed087146.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;配置完成后生成代码。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/0d1f0e7d-8a4a-4b35-89d0-fea4f6ea42dc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/59182a72-a5b8-4654-9f40-fcc46820b3d2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择为每个外设生成单独的源文件&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dma.c&lt;/code&gt;和&lt;code&gt;gpio.c&lt;/code&gt;中仅包含一般的初始化代码&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    dma.c
  * @brief   This file provides code for the configuration
  *          of all the requested memory to memory DMA transfers.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include &quot;dma.h&quot;

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure DMA                                                              */
/*----------------------------------------------------------------------------*/

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/**
  * Enable DMA controller clock
  */
void MX_DMA_Init(void)
{

  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

  /* DMA interrupt init */
  /* DMA1_Channel1_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

}

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    gpio.c
  * @brief   This file provides code for the configuration
  *          of all used GPIO pins.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include &quot;gpio.h&quot;

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

}

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;主要的逻辑在&lt;code&gt;tim.c&lt;/code&gt;文件中&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    tim.c
  * @brief   This file provides code for the configuration
  *          of the TIM instances.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include &quot;tim.h&quot;

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

TIM_HandleTypeDef htim1;
DMA_HandleTypeDef hdma_tim1_ch1;

/* TIM1 init function */
void MX_TIM1_Init(void)
{

  /* USER CODE BEGIN TIM1_Init 0 */

  /* USER CODE END TIM1_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  /* USER CODE BEGIN TIM1_Init 1 */

  /* USER CODE END TIM1_Init 1 */
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 16-1;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 100-1;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&amp;amp;htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&amp;amp;htim1, &amp;amp;sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&amp;amp;htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&amp;amp;htim1, &amp;amp;sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&amp;amp;htim1, &amp;amp;sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.BreakFilter = 0;
  sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;
  sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
  sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
  sBreakDeadTimeConfig.Break2Filter = 0;
  sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&amp;amp;htim1, &amp;amp;sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM1_Init 2 */

  /* USER CODE END TIM1_Init 2 */
  HAL_TIM_MspPostInit(&amp;amp;htim1);

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle-&amp;gt;Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspInit 0 */

  /* USER CODE END TIM1_MspInit 0 */
    /* TIM1 clock enable */
    __HAL_RCC_TIM1_CLK_ENABLE();

    /* TIM1 DMA Init */
    /* TIM1_CH1 Init */
    hdma_tim1_ch1.Instance = DMA1_Channel1;
    hdma_tim1_ch1.Init.Request = DMA_REQUEST_TIM1_CH1;
    hdma_tim1_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_tim1_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_tim1_ch1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_tim1_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_tim1_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_tim1_ch1.Init.Mode = DMA_NORMAL;
    hdma_tim1_ch1.Init.Priority = DMA_PRIORITY_HIGH;
    if (HAL_DMA_Init(&amp;amp;hdma_tim1_ch1) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_CC1],hdma_tim1_ch1);

  /* USER CODE BEGIN TIM1_MspInit 1 */

  /* USER CODE END TIM1_MspInit 1 */
  }
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(timHandle-&amp;gt;Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspPostInit 0 */

  /* USER CODE END TIM1_MspPostInit 0 */

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**TIM1 GPIO Configuration
    PA8     ------&amp;gt; TIM1_CH1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
    HAL_GPIO_Init(GPIOA, &amp;amp;GPIO_InitStruct);

  /* USER CODE BEGIN TIM1_MspPostInit 1 */

  /* USER CODE END TIM1_MspPostInit 1 */
  }

}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle-&amp;gt;Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspDeInit 0 */

  /* USER CODE END TIM1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_TIM1_CLK_DISABLE();

    /* TIM1 DMA DeInit */
    HAL_DMA_DeInit(tim_baseHandle-&amp;gt;hdma[TIM_DMA_ID_CC1]);
  /* USER CODE BEGIN TIM1_MspDeInit 1 */

  /* USER CODE END TIM1_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;剩下的逻辑写在&lt;code&gt;main.c&lt;/code&gt;中&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include &quot;main.h&quot;
#include &quot;dma.h&quot;
#include &quot;tim.h&quot;
#include &quot;gpio.h&quot;

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

#define PWM_BATCH_SIZE 1000 // 1000 x 2 bytes = 2KB 内存占用

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

static uint16_t pwm_data[PWM_BATCH_SIZE];  // 固定缓存区
static uint32_t total_pulses_remaining = 0;
static uint32_t current_batch_size = 0;

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) // 传输完成回调
{
    if (htim-&amp;gt;Instance == TIM1)
    {
        if (total_pulses_remaining &amp;gt; 0)
        {
            current_batch_size = (total_pulses_remaining &amp;gt; PWM_BATCH_SIZE) ? PWM_BATCH_SIZE : total_pulses_remaining;
            total_pulses_remaining -= current_batch_size;
                        // 开始输出脉冲
            HAL_TIM_PWM_Start_DMA(&amp;amp;htim1, TIM_CHANNEL_1, (uint32_t *)pwm_data, current_batch_size);
        }
        else
        {
            // 所有脉冲发送完毕
            HAL_TIM_PWM_Stop_DMA(&amp;amp;htim1, TIM_CHANNEL_1);
        }
    }
}

/**
 * @param total_pulses 总的脉冲数
 * @param duty_value 占空比对应的 CCR 值（比如 50 表示 50% 占空比）
*/
void Start_PWM_Pulses_DMA_Extended(uint32_t total_pulses, uint16_t duty_value)
{
    if (total_pulses == 0) return;

    total_pulses_remaining = total_pulses;

    // 填充缓存
    for (uint16_t i = 0; i &amp;lt; PWM_BATCH_SIZE; i++) {
        pwm_data[i] = duty_value;
    }

    // 启动第一批
    current_batch_size = (total_pulses_remaining &amp;gt; PWM_BATCH_SIZE) ? PWM_BATCH_SIZE : total_pulses_remaining;
    total_pulses_remaining -= current_batch_size;

    HAL_TIM_PWM_Start_DMA(&amp;amp;htim1, TIM_CHANNEL_1, (uint32_t *)pwm_data, current_batch_size);
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */

    Start_PWM_Pulses_DMA_Extended(100000, 50);  // 输出10万个50%占空比的PWM脉冲   

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&amp;amp;RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&amp;amp;RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf(&quot;Wrong parameters value: file %s on line %d\r\n&quot;, file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://shequ.stmicroelectronics.cn/thread-629158-1-1.html&quot;&gt;STM32定时器产生指定个数脉冲 - STM32团队 ST意法半导体中文论坛&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/feiniaoliangtiangao/p/10745691.html&quot;&gt;基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序 - 飞鸟量天高 - 博客园&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;代码由 GPT-4o-Latest 生成&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/STM32%E4%BD%BF%E7%94%A8DMA%E6%8E%A7%E5%88%B6%E8%84%89%E5%86%B2%E6%95%B0%E9%87%8F.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/STM32%E4%BD%BF%E7%94%A8DMA%E6%8E%A7%E5%88%B6%E8%84%89%E5%86%B2%E6%95%B0%E9%87%8F.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>STM32之串口通信实验</title>
            <description>
            &lt;!--
author: admin
date: 2025-03-26
title: STM32之串口通信实验
tags: 串口,stm32
category: C
status: publish
summary: 初入 STM32
--&gt;
&lt;h1&gt;STM32串口通信实验&lt;/h1&gt;
&lt;h3&gt;配置STM32CubeMX&lt;/h3&gt;
&lt;p&gt;在 Pinout&amp;amp;Configuration 栏目的 System Core 下，先点击 SYS,再勾选 Serial Wire 框，配置好 SWD 下载引脚设置。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/12419bbd-b069-4915-81d7-3fb6d8a0c3da.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;配置外部时钟源&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/1fb3f8ba-0519-4a33-b010-239acb7d1753.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/7cd08448-7aa1-4e2c-b0b1-1d14eebbe50a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;配置 PB6,PB7 为 USART1 收发引脚。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e39e56ae-edf6-4dbe-914a-c17ec2036554.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;完成后生成代码&lt;/p&gt;
&lt;h3&gt;编辑代码&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int main(void)
{

  /* USER CODE BEGIN 1 */
  uint8_t   Transmit_data[] = {&quot;World_Skills_Competition\r\n&quot;}; // 定义需要发送的字符串

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();  // HAL 库初始化

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();  // 时钟初始化

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();     // GPIO 初始化
  MX_USART1_UART_Init();  // 串口初始化
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_UART_Transmit(&amp;amp;huart1, Transmit_data, sizeof(Transmit_data)+1, 1000); // 发送字符串
    HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译下载后，使用TTL转USB模块连上电脑后用串口助手就可以查看发送的信息。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;printf()&lt;/code&gt;重定向实验&lt;/h3&gt;
&lt;p&gt;对于 STM32 来说，串口是一种常用的调试手段，在程序中加入串口调试语句，可以降低程序调试的难度。&lt;/p&gt;
&lt;p&gt;通过使用串口作为&lt;code&gt;printf()&lt;/code&gt;函数的输出对象，使得在程序中可以用&lt;code&gt;printf()&lt;/code&gt;来发送串口数据，就像在 PC 上用 C 语言控制台编程一样。&lt;/p&gt;
&lt;p&gt;首先在&lt;code&gt;usart.h&lt;/code&gt;中加入以下代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* USER CODE BEGIN Includes */

#ifndef UART_PRINTF_H
#define UART_PRINTF_H

#include &amp;lt;stdio.h&amp;gt;

void UART_Printf_Init(UART_HandleTypeDef *huart);

#endif /* UART_PRINTF_H */

/* USER CODE END Includes */&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在&lt;code&gt;usart.c&lt;/code&gt;中添加以下代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/* USER CODE BEGIN 0 */

static UART_HandleTypeDef *debug_uart;  // Store UART handle

// Initialize UART for printf redirection
void UART_Printf_Init(UART_HandleTypeDef *huart)
{
    debug_uart = huart;  // Assign the UART handle
}

// Redirect printf() output to UART
int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(debug_uart, (uint8_t *)&amp;amp;ch, 1, HAL_MAX_DELAY);
    return ch;
}

// Redirect scanf() input from UART (optional)
int fgetc(FILE *f)
{
    uint8_t ch = 0;
    HAL_UART_Receive(debug_uart, &amp;amp;ch, 1, HAL_MAX_DELAY);
    return ch;
}

/* USER CODE END 0 */&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改&lt;code&gt;main&lt;/code&gt;函数&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  UART_Printf_Init(&amp;amp;huart1);  // 初始化printf重定向

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

    printf(&quot;Hello STM32\r\n&quot;);
    HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;点击Keil5中的这个图标&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/6608e963-74b7-450e-a5c0-1e41c45c2739.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/49bef8c4-c3bc-4cd1-8dd1-0fa865c53001.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;修改完成后编译下载，运行程序即可在串口助手中看到信息。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/STM32%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1%E5%AE%9E%E9%AA%8C.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/STM32%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1%E5%AE%9E%E9%AA%8C.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>STM32之ADC通道采集片内温度并通过串口传输</title>
            <description>
            &lt;!--
author: admin
date: 2025-03-15
title: STM32之ADC通道采集片内温度并通过串口传输
tags: ADC,串口,stm32
category: C
status: publish
summary: 初入 STM32
--&gt;
&lt;h1&gt;STM32之ADC通道采集片内温度并通过串口传输&lt;/h1&gt;
&lt;h3&gt;软件实验要求&lt;/h3&gt;
&lt;p&gt;系统主频 16 MHZ,采用内部晶振，通过 DMA 采样三个数，一个是 PA4 引脚上的电压电平，一个是内部温度传感器数值，还有个是 VREF 电压。然后通过芯片 PB6,PB7 的 USART1 口，实现串口通信传输数据。&lt;/p&gt;
&lt;h4&gt;使用STM32CubeMX创建项目&lt;/h4&gt;
&lt;p&gt;使用STM32CubeMX新建并配置好 PA4 为 ADC 口，内部温度采集，以及内部参考电压采集，再配置 DMA 以及中断。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;新建好 STM32G030C8T6 的 STM32CubeMX 工程之后，在如图 2.1 在Pinout&amp;amp;Configuration 栏目的 System Core 下，先点击 SYS,再勾选 Serial Wire 框，配置好 SWD 下载引脚设置，系统默认采用内部 16MHZ 晶振，默认系统主频是 16MHZ，所以不需要配晶振与 PLL。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;index_files/f9e2eab7-7841-4a89-b8d2-cc94edb303c5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图2.1&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;如图 2.2 的 1,2,3 步骤完成 PA4 引脚作为 ADC 通道 4 引脚，内部参考电压采集以及温度采集。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;index_files/cc2ec293-0848-4034-90ae-a96f981cffac.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图2.2&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;如图 2.4，如图 2.5 完成 DMA 配置。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;index_files/0d3b1c50-8090-47ae-a8bf-23e8f49e9ba4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图2.4&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/29c1b934-9d10-480c-ba00-224f6ebbf484.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图2.5&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;如图 2.3 的 1,2,3,4,5 步骤完成 ADC 采集参数配置。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;index_files/596dee22-de9e-4387-8444-a1bcebf90fd8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图2.3&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;如图2.6，图2.7配置 PB6,PB7 为 USART1 收发引脚以及相应的中断使能。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;index_files/d651dbb6-5d1d-48e3-9a9f-bac152fe4637.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图2.6&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/18715424-65b0-4ba6-8c03-eefc8b0a8f15.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图2.7&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;如图2.8，图2.9 配置项目&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;index_files/13ef6260-bbf9-4db3-b4f7-0ac4b14256ce.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图2.8&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/dd4bf843-6a7c-476e-a3af-714c5be806cb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图2.9&lt;/p&gt;
&lt;p&gt;完成配置之后，生成工程代码。&lt;/p&gt;
&lt;h3&gt;使用 Keil uVision 5编辑&lt;/h3&gt;
&lt;p&gt;在&lt;code&gt;main.h&lt;/code&gt;中添加&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;//...
/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */

/* USER CODE END EM */

/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);

/* USER CODE BEGIN EFP */

#define DIGITAL_SCALE_12BITS ((uint32_t) 0xFFF)

/* Init variable out of ADC expected conversion data range */
#define VAR_CONVERTED_DATA_INIT_VALUE (DIGITAL_SCALE_12BITS + 1)

/* Definition of ADCx conversions data table size */
#define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t)  3)

/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/

/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */
//...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;usart.h&lt;/code&gt;中添加&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;//...
/* Includes ------------------------------------------------------------------*/
#include &quot;main.h&quot;

/* USER CODE BEGIN Includes */

void UART_Print(char *msg);

/* USER CODE END Includes */

extern UART_HandleTypeDef huart1;

/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */
// ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;usart.c&lt;/code&gt;中定义&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;//...

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include &quot;usart.h&quot;
#include &quot;string.h&quot;

/* USER CODE BEGIN 0 */

void UART_Print(char *msg) {
    HAL_UART_Transmit(&amp;amp;huart1, (uint8_t *)msg, strlen(msg), HAL_MAX_DELAY);
}

/* USER CODE END 0 */

UART_HandleTypeDef huart1;

//...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;main.c&lt;/code&gt;中修改，首先添加头文件&lt;code&gt;#include &quot;stdio.h&quot;&lt;/code&gt;，然后&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;//...
//存放3组数据，分别是ADC1_Ch4,温度，参考电压
__IO   uint16_t   aADCxConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];

//定义变量，在ADC采样结束，DMA传送完成置位，方便主程序取数据
__IO   uint8_t ubDmaTransferStatus = 2;

//温度值，单位度
uint32_t Tempruate;

//参考电压值，ADC1_Ch4采样电压值，单位V
uint16_t VrefData, VolDta;

//ADC数据采样结束回调函数，用于置位采样结束标志位
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
  /* Prevent unused argument(s) compilation warning */
     UNUSED(hadc);

    //置1
   ubDmaTransferStatus=1;
}
//...&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

    uint32_t tmp_index_adc_converted_data = 0;

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

    for (tmp_index_adc_converted_data = 0; tmp_index_adc_converted_data &amp;lt; ADC_CONVERTED_DATA_BUFFER_SIZE; tmp_index_adc_converted_data++)
  {
        //采样数组清零
    aADCxConvertedData[tmp_index_adc_converted_data] = VAR_CONVERTED_DATA_INIT_VALUE;  
  }

    //ADC自校准
    if (HAL_ADCEx_Calibration_Start(&amp;amp;hadc1) != HAL_OK)
  {
    /* Calibration Error */
    while(1);
  }

    //启动ADC DMA传输
    if (HAL_ADC_Start_DMA(&amp;amp;hadc1,
                        (uint32_t *)aADCxConvertedData,
                        ADC_CONVERTED_DATA_BUFFER_SIZE
                       ) != HAL_OK)
  {
    /* ADC conversion start error */
    while(1);
  }

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

        /* Clear DMA buffer when filled before refilling it */
    if (ubDmaTransferStatus == 1)//判断数据是否已经转换完成
    {
            VolDta=aADCxConvertedData[0]*3300/4096;//计算通道ADC1_Ch4采样到的电压值
            VrefData=__LL_ADC_CALC_VREFANALOG_VOLTAGE(aADCxConvertedData[2],ADC_RESOLUTION_12B);//计算参考电压
          Tempruate=__HAL_ADC_CALC_TEMPERATURE(VrefData,aADCxConvertedData[1],ADC_RESOLUTION_12B);//计算温度值

            char message[100];
            sprintf(message, &quot;Voltage: %d mV, Temp: %lu C, Vref: %d mV\n&quot;, VolDta, Tempruate, VrefData);
            UART_Print(message);

            HAL_Delay(5000);

      for (tmp_index_adc_converted_data = 0; tmp_index_adc_converted_data &amp;lt; ADC_CONVERTED_DATA_BUFFER_SIZE; tmp_index_adc_converted_data++)
      {
        aADCxConvertedData[tmp_index_adc_converted_data] = VAR_CONVERTED_DATA_INIT_VALUE;//采样数组清0
      }
      /* Update status variable of DMA transfer */
      ubDmaTransferStatus = 0;//完成标志清0
    }

  }
  /* USER CODE END 3 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;点击编译，导入程序&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/cc1fb204-be92-4e80-bc37-15a1ef9e44fd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用TTL转USB接上开发板，打开串口程序&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/103b02b8-fc6d-4b14-ab81-a4cb968b1dd2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为什么会出现923，922等数据，我暂时还没搞懂，之后再更新。&lt;/p&gt;
&lt;p&gt;2025年3月28日更新：&lt;/p&gt;
&lt;p&gt;之前有遇到会出现923，922这样的数据，大概是因为&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;char message[100];
sprintf(message, &quot;Voltage: %d mV, Temp: %lu C, Vref: %d mV\n&quot;, VolDta, Tempruate, VrefData);
UART_Print(message);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样的方法，造成了溢出，可以根据 &lt;a href=&quot;https://www.syuez.com/blog/STM32%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1%E5%AE%9E%E9%AA%8C.html&quot;&gt;https://www.syuez.com/blog/STM32%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1%E5%AE%9E%E9%AA%8C.html&lt;/a&gt; 文章中的&lt;code&gt;printf()&lt;/code&gt;重定向来解决。&lt;/p&gt;
&lt;p&gt;将发送方法改成&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;printf(&quot;Voltage: %d mV, Temp: %d C, Vref: %d mV\n&quot;, VolDta, Tempruate, VrefData);&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;文字部分代码由GPT-4o生成&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/STM32%E4%B9%8BADC%E9%80%9A%E9%81%93%E9%87%87%E9%9B%86%E7%89%87%E5%86%85%E6%B8%A9%E5%BA%A6%E5%B9%B6%E9%80%9A%E8%BF%87%E4%B8%B2%E5%8F%A3%E4%BC%A0%E8%BE%93.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/STM32%E4%B9%8BADC%E9%80%9A%E9%81%93%E9%87%87%E9%9B%86%E7%89%87%E5%86%85%E6%B8%A9%E5%BA%A6%E5%B9%B6%E9%80%9A%E8%BF%87%E4%B8%B2%E5%8F%A3%E4%BC%A0%E8%BE%93.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>商务文件-投标模板</title>
            <description>
            &lt;!--
author: admin
date: 2025-02-13
title: 商务文件-投标模板
tags: 商务
category: 招投标
status: publish
summary: 招投标~
--&gt;
&lt;h1&gt;商务文件-投标模板&lt;/h1&gt;
&lt;h2&gt;授权委托书&lt;/h2&gt;
&lt;p&gt;（按招标文件标准格式提供）&lt;/p&gt;
&lt;h2&gt;商务偏差表&lt;/h2&gt;
&lt;p&gt;（按招标文件标准格式提供）&lt;/p&gt;
&lt;h2&gt;第三章 投标人资格证明文件&lt;/h2&gt;
&lt;h3&gt;第一条 企业概况&lt;/h3&gt;
&lt;h3&gt;第二条 企业资质证书&lt;/h3&gt;
&lt;p&gt;（提供行业许可证、体系认证等，属于科研创新类的奖项证书详见第三章第十二条）&lt;/p&gt;
&lt;h3&gt;第三条 联合体协议书&lt;/h3&gt;
&lt;p&gt;（若以联合体投标，此处附协议；否则填写“无”并加盖公章）&lt;/p&gt;
&lt;h3&gt;第四条 企业信誉&lt;/h3&gt;
&lt;p&gt;投标人须提供无失信行为记录的有效证明，所需电子查询结果汇总详见第三章第五条第二点“查询报告及截图”。&lt;/p&gt;
&lt;h3&gt;第五条 资格证明文件&lt;/h3&gt;
&lt;p&gt;本条是对招标文件“符合招标公告投标人资格要求”条款的逐项响应，请按以下顺序编制。&lt;/p&gt;
&lt;h4&gt;一、通用资格承诺函&lt;/h4&gt;
&lt;p&gt;我司承诺满足全部通用资格要求。其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;（1）关于财务状况和商业信用的详细证明材料，详见第三章第五条第二点“查询报告及截图”和第三章第六条“财务状况”；&lt;/li&gt;
&lt;li&gt;（2）关于未被“信用中国”列入严重失信主体名单的证明，详见第三章第五条第二点第一小点“信用中国”；&lt;/li&gt;
&lt;li&gt;（3）关于在国家企业信用信息公示系统无严重违法失信、经营异常等记录的证明，详见第三章第五条第二点第二小点“国家企业信用信息公示系统”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;二、查询报告及截图&lt;/h4&gt;
&lt;p&gt;为支撑上述承诺，投标人必须提供下列网站的查询报告及完整截图，缺一不可。&lt;/p&gt;
&lt;h5&gt;（一）信用中国&lt;/h5&gt;
&lt;p&gt;查询网址：www.creditchina.gov.cn，要求截图包含查询时间、企业名称及“未列入严重失信主体名单”结果。页面跳转方法及截图保存规范详见第三章第五条第二点第一小点“信用中国”。&lt;/p&gt;
&lt;h5&gt;（二）国家企业信用信息公示系统&lt;/h5&gt;
&lt;p&gt;查询网址：www.gsxt.gov.cn，须生成包含“营业执照信息”“列入严重违法失信企业名单（黑名单）”“列入经营异常名录信息”“行政处罚信息”“清算信息”的完整报告，截图与导出规则详见第三章第五条第二点第二小点“国家企业信用信息公示系统”。&lt;/p&gt;
&lt;h4&gt;三、其他资格材料&lt;/h4&gt;
&lt;p&gt;（如需提供许可证、强制认证等，请在本处附入，无则填“无”）&lt;/p&gt;
&lt;h3&gt;第六条 财务状况&lt;/h3&gt;
&lt;p&gt;投标人应提供近三年经审计的财务报告，并依据第三章第六条“财务状况”所附表格汇总资产负债率、流动比率、净资产收益率等关键指标。报告正文可附于本章末尾。&lt;/p&gt;
&lt;h3&gt;第七条 类似项目业绩&lt;/h3&gt;
&lt;p&gt;（提供合同关键页及用户评价证明）&lt;/p&gt;
&lt;h3&gt;第八条 拟派项目经理及技术负责人&lt;/h3&gt;
&lt;p&gt;（附职称证书、社保证明及简历）&lt;/p&gt;
&lt;h3&gt;第九条 拟投入设备及软件&lt;/h3&gt;
&lt;p&gt;（列表说明主要设备名称、型号、用途）&lt;/p&gt;
&lt;h3&gt;第十条 服务大纲&lt;/h3&gt;
&lt;p&gt;（简述档案管理方案、数字化流程、保密措施等）&lt;/p&gt;
&lt;h3&gt;第十一条 安全管理与应急预案&lt;/h3&gt;
&lt;p&gt;（包括项目实体安全、网络安全及突发事件处置）&lt;/p&gt;
&lt;h3&gt;第十二条 科研创新证明文件&lt;/h3&gt;
&lt;p&gt;投标人应在本条下列分点中提供创新成果附件，用于响应商务评分标准中的“科研创新评价”。自第三点“专利证书”至第六点“计算机软件著作权登记证书”的详细清单及扫描件，详见第三章第十二条第三点“专利证书”至第六点“计算机软件著作权登记证书”。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;创新激励机制&lt;/strong&gt;：（描述企业内部激励制度，如无则写“无”）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;研发团队规模&lt;/strong&gt;：（列表说明学历、人数，如无则写“无”）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;专利证书&lt;/strong&gt;：（附发明专利、实用新型专利证书复印件）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;科技型中小企业证书&lt;/strong&gt;：（如有）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算机软件著作权登记证书&lt;/strong&gt;：（附登记证复印件）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他科技成果&lt;/strong&gt;：（论文、工法、标准等，可自行扩展）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第四章 商务评分其他支撑材料&lt;/h2&gt;
&lt;p&gt;（如绿色低碳评价、综合评价等，按招标文件要求提供，相关引用请勿使用“第三章”编号，应另列为“第四章”或直接写明标题）&lt;/p&gt;
&lt;h2&gt;第五章 其他文件&lt;/h2&gt;
&lt;p&gt;（企业名称变更证明、财务审核凭证单、公章授权书等，按需附入）&lt;/p&gt;
&lt;h2&gt;第六章 附件&lt;/h2&gt;
&lt;p&gt;（审计报告全文、证书原件扫描件等大型文件，在此处集中放置）&lt;/p&gt;            </description>
            <pubDate>2026-05-14 06:29:33</pubDate>
            <link>https://www.syuez.com/blog/%E5%95%86%E5%8A%A1%E6%96%87%E4%BB%B6.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%95%86%E5%8A%A1%E6%96%87%E4%BB%B6.html</guid>
                                               <category>招投标</category>
                                    </item>
                <item>
            <title>楼顶钢结构广告牌施工方案</title>
            <description>
            &lt;!--
author: admin
date: 2024-10-10
title: 楼顶钢结构广告牌施工方案
tags: 广告牌
category: 招投标
status: publish
summary: 招投标~
--&gt;
&lt;h1&gt;小微金融服务中心楼楼顶标语牌施工方案&lt;/h1&gt;
&lt;h2&gt;一 工程概况：&lt;/h2&gt;
&lt;p&gt;拟建标语牌工程位于克拉玛依市小微金融服务中心楼楼顶，拟建标语牌尺寸为12.5m*3.2m*2，安装楼顶大字，尺寸为2.5mX15m。&lt;/p&gt;
&lt;h2&gt;二 方案编制依据&lt;/h2&gt;
&lt;p&gt;2.1 本项目施工图纸&lt;/p&gt;
&lt;p&gt;2.2 本工程内部质量、安全、环境管理体系文件，公司标准及管理制度&lt;/p&gt;
&lt;p&gt;2.3 我公司拟建类似工程长期积累的施工经验&lt;/p&gt;
&lt;p&gt;2.4 我公司各项资源配备以及本地区可利用资源和施工现场实际情况&lt;/p&gt;
&lt;p&gt;2.5 本工程所涉及的主要国家或行业规范、规程、标准、图集等&lt;/p&gt;
&lt;p&gt;《钢结构工程施工及验收规范》GB50205-95&lt;/p&gt;
&lt;p&gt;《建筑钢结构焊接规程》JGJ81-91&lt;/p&gt;
&lt;p&gt;《钢结构制作工艺规程》DBJ08-216-95&lt;/p&gt;
&lt;p&gt;《钢结构高强度连接的设计、施工及验收规程》JGJ82-91&lt;/p&gt;
&lt;p&gt;《冷弯薄壁型钢结构技术规范》GBJ18-2002&lt;/p&gt;
&lt;h2&gt;三 工程特点分析&lt;/h2&gt;
&lt;p&gt;3.1 工期紧、施工难度大，现场构件及设备只能依靠吊车运输。&lt;/p&gt;
&lt;p&gt;3.2 构件品种多：本工程因各种钢构件需工厂加工制作，然后装车运至施工现场，各种构配件必须有组织、有计划按照图纸要求分类编号，小构件需分类打包。水平方向三根横杆必须在钢架按照完成后方可加工，构件长度尺寸多&lt;/p&gt;
&lt;p&gt;3.3 施工安全：本工程在已投入使用的屋面上施工，四周无任何防护措施，楼层高，因此本工程的安全为施工中的重中之重。&lt;/p&gt;
&lt;h2&gt;四 施工部署&lt;/h2&gt;
&lt;h3&gt;4.1 实施目标&lt;/h3&gt;
&lt;p&gt;4.1.1 在保证工程质量的前提下，确保完工。安全文明施工：采取有效措施，杜绝工伤、死亡及一切安全事故发生。&lt;/p&gt;
&lt;h3&gt;4.2 施工准备工作&lt;/h3&gt;
&lt;h4&gt;4.2.1 设计阶段&lt;/h4&gt;
&lt;p&gt;根据建设单位意图，了解其总体设想，并根据施工图进行详图设计并组织施工。&lt;/p&gt;
&lt;h4&gt;4.2.3 制作运输阶段&lt;/h4&gt;
&lt;p&gt;（1） 钢构件在开始制作前，因安排相关人员进行技术交底工作。&lt;/p&gt;
&lt;p&gt;（2） 技术交底完工后，因根据工程特点制定详细施工方案。&lt;/p&gt;
&lt;p&gt;（3） 因本工程钢构件为厂内制作、厂外安装，所有钢构件制作因详细区分各安装单元构件&lt;/p&gt;
&lt;p&gt;（4） 钢构件制作安装过程中，因注意各种材料的收集及整理工作。&lt;/p&gt;
&lt;p&gt;（5） 钢构件上屋面前，因提前联系好运输车辆及吊装吊车。&lt;/p&gt;
&lt;h3&gt;4.3 施工协调管理&lt;/h3&gt;
&lt;h4&gt;4.3.1 与设计人员的协调&lt;/h4&gt;
&lt;p&gt;（1）施工过程中与设计人员保持联系、配合，积极解决施工过程中的疑难问题。&lt;/p&gt;
&lt;p&gt;（2）充分考虑施工过程中的各种结构问题，完善施工图设计。&lt;/p&gt;
&lt;h4&gt;4.3.2 与建设单位的协调&lt;/h4&gt;
&lt;p&gt;（1）积极与建设单位保持联系，精心施工，确保工程中各项技术指标合格&lt;/p&gt;
&lt;p&gt;（2）主动接受建设单位施工过程中的监督，定期向建设单位汇报工程进展情况，对于需要建设单位协调工作，因立即向有关负责人汇报并请求解决。&lt;/p&gt;
&lt;h3&gt;4.4 施工现场平面布置&lt;/h3&gt;
&lt;p&gt;4.4.1 由于本工程工期紧且位于市政府大院内，楼下现场不允许材料堆积，为确保工程不影响卫生整洁，故现场不设办公室等临时设施，现场材料以运输楼底下后即组织吊车运至楼顶。&lt;/p&gt;
&lt;p&gt;4.4.2 解决临时用水、用电&lt;/p&gt;
&lt;p&gt;主要施工机械设备用电在现场配电箱，电源从业主提供的配电箱引入；因钢工程为干作业，故施工过程中除生活用水外基本无需用水。&lt;/p&gt;
&lt;h2&gt;五 施工组织&lt;/h2&gt;
&lt;h3&gt;5.1 项目管理层的组织及选派&lt;/h3&gt;
&lt;p&gt;本工程特点和重要意义，决定了管理人员的配备必需全面且具有较高的专业素质，我公司具备丰富的施工经验及管理水平，在施工管理及协调控制能力上有很大优势。而在施工人员组织上有广泛选择空间，在组建工程项目管理班子时，我公司选派曾施工过类似工程具有丰富工作经验的施工人员参与本工程的建设及管理。&lt;/p&gt;
&lt;h3&gt;5.2 项目质量管理&lt;/h3&gt;
&lt;p&gt;在主材方面，要有出场合格证和质保书，其他材料，我们将货比三家，从质量上，单价上把关。&lt;/p&gt;
&lt;h2&gt;六 工艺流程&lt;/h2&gt;
&lt;p&gt;根据实际情况，按先立钢结构支撑结构，再立标语牌的原则施工。本工程分为两个施工段，每一施工段按以下流程施工：搭设脚手架→找平→测量放线→铺设预制埋板→安装钢结构支撑→安装楼顶字&lt;/p&gt;
&lt;h3&gt;6.1 测量工具的选用&lt;/h3&gt;
&lt;p&gt;测量中所用的仪器和钢尺等器具，根据有关规定，送有资质部门进行校验，检验合格后方可使用。&lt;/p&gt;
&lt;p&gt;现场测量仪器一览表&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;器具名称&lt;/th&gt;
&lt;th&gt;型 号&lt;/th&gt;
&lt;th&gt;单位&lt;/th&gt;
&lt;th&gt;个数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;经纬仪&lt;/td&gt;
&lt;td&gt;J 2&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;水准尺&lt;/td&gt;
&lt;td&gt;DS3&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;钢尺&lt;/td&gt;
&lt;td&gt;30m&lt;/td&gt;
&lt;td&gt;把&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;卷尺&lt;/td&gt;
&lt;td&gt;5m&lt;/td&gt;
&lt;td&gt;把&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;墨斗&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;只&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;6.3 测量放线&lt;/h3&gt;
&lt;h4&gt;6.3.1 格构梁上放线&lt;/h4&gt;
&lt;p&gt;在每一道格构梁上，找出梁中线，并用墨斗弹线，量外墙内边边线沿梁中线150mm作标记，此标记为梁上第一个埋板中心点，以此点沿格构梁中线向后量4100mm在梁中心线上作标记，此点为此道梁上第二块埋板中心点。&lt;/p&gt;
&lt;p&gt;在十五四轴线架设水准仪，以十六轴线第二埋板中心点作测量第一基准点，在每一埋板中心点上架设水准尺，记录此点标高，此基准点标高为1551mm。&lt;/p&gt;
&lt;h4&gt;6.3.2 预埋件施工&lt;/h4&gt;
&lt;p&gt;（1）预埋件施工前，必须对原有建筑物的轴线及标高进行复测，对照施工图纸，如轴线或标高出现偏差，及时反馈至设计人员，由设计人员进行设计变更。&lt;br /&gt;
（2）轴线弹线：根据施工图纸，在建筑物上弹出轴线，然后进行找平工作。&lt;br /&gt;
（3）植筋&lt;br /&gt;
钻孔：若在钻孔过程中遇到钢筋，可适当偏斜钻孔，单偏移距离不得超过10mm，每个钻孔深度为260mm。&lt;/p&gt;
&lt;p&gt;若在钻孔过程中如遇到钢筋，此预埋件不做植筋处理，预埋件紧贴80*80方管前后各焊75mm角钢，焊接方式为两面焊接，焊接长度为100mm，角钢长度为310mm。贴近梁两侧角钢中心部位钻大小为24mm孔洞，从梁下用直径22mm的U型箍从孔洞穿入，U型箍上面拧上螺帽。&lt;br /&gt;
（4）清孔：先用毛刷刷出孔内混凝土碎屑，再用气泵吹出孔内灰尘，反复进行三次。&lt;br /&gt;
（5）注胶：使用胶黏剂手动注射器从孔底部开始向外填注化学黏合剂，注入剂量为孔深的三分之二。&lt;br /&gt;
植筋：植入钢筋并等待黏合剂固化。&lt;/p&gt;
&lt;h4&gt;6.3.3 组装&lt;/h4&gt;
&lt;p&gt;（1）钢结构组装前，应按施工图、施工方案及其下料单，清点和检查加工件的材质、规格、数量和加工质量，并将组件连接接触部位和沿焊缝边缘每边30～50mm范围内的铁锈、毛刺、污垢等清除干净。&lt;/p&gt;
&lt;h4&gt;6.3.4 矫正&lt;/h4&gt;
&lt;p&gt;组合型钢因焊接产生的变形，本工程采用机械和高温加热矫正调直，进行热矫正时，加热温度不应超过900℃，加热矫正后应自然冷却，在矫正过程中，不得损坏钢材材料组织。&lt;/p&gt;
&lt;h4&gt;6.3.5 除锈、施涂&lt;/h4&gt;
&lt;p&gt;（1）本工程采用机械抛丸除锈。除锈使用的磨料必须符合质量标准和工艺要求，施工环境相对湿度不应大于85％。经除锈后的钢材表面，用毛刷等工具清扫干净，才能进行下道工序，除锈合格后的钢材表面，如在涂底漆前已返锈，需重新除锈。&lt;/p&gt;
&lt;h4&gt;6.3.6 钢结构安装&lt;/h4&gt;
&lt;p&gt;（1）材料到达现场前，我公司将派人进驻现场，为安装工作做好充分准备。&lt;/p&gt;
&lt;p&gt;（2）本工程安装原则为我公司指导施工人员操作，组织挑选各种必需工种人员，并进行施工前安装技术及安全交底工作，同时贯彻落实工程质量及安全目标。&lt;/p&gt;
&lt;p&gt;本工程建筑物为已经投入施工，无塔吊等可利用的垂直运输工具，因此钢结构垂直运输采用25t吊车运至屋面。构件吊装采用两台25t汽车吊在地面吊装。吊装时，应在吊装区域设置警戒线与警示牌，提前通知相关管理部门，防止违法占路。&lt;/p&gt;
&lt;p&gt;根据本工程的结构形式，钢结构安装的工艺流程为：&lt;br /&gt;
构件运输到位→设备调试就位→构件屋面上拼装→骨架整体吊装→骨架临时支撑→骨架柱脚焊接→相应骨架支撑安装→主体结构验收→楼顶字安装。&lt;/p&gt;
&lt;h2&gt;七 高空安全保证措施&lt;/h2&gt;
&lt;h3&gt;7.1 安全管理体系及安全目标&lt;/h3&gt;
&lt;p&gt;7.1.1 安全生产管理目标：杜绝死亡、重伤事故，轻伤事故频率低于0.6%，职业病发生率为零。&lt;/p&gt;
&lt;p&gt;7.1.2 安全生产达标目标：按照《建筑施工安全检查标准》JGJ59---99检查达到优良。&lt;/p&gt;
&lt;p&gt;7.1.3 安全生产管理体系&lt;/p&gt;
&lt;p&gt;成立以项目经理为第一责任人的由安全员、施工工长、设备员、技术员、班组长组成的安全管理领导小组。负责日常的安全检查和监督。安全员每天进行一次检查，由专职安全员组织班组进行一次安全小结，专职安全员负责日常的安全监督、安全生产检查。&lt;/p&gt;
&lt;h3&gt;7.2 高空安全生产措施&lt;/h3&gt;
&lt;p&gt;7.2.1 认真落实安全生产岗位责任制，做到分工、责任双落实。严格遵守安全生产六大纪律。&lt;/p&gt;
&lt;p&gt;7.2.2 进入施工现场，必须戴安全帽，高空作业人员必须戴安全带、挂好安全带，穿防滑鞋，扎紧带好劳动工具。电焊工、电工等特殊工种必须持证上岗。&lt;/p&gt;
&lt;p&gt;7.2.3 所有机械设备必须接零、接地保护、配电箱设置漏电保护器，施工用电缆路必须保证绝对高度绝缘，且专门管理。&lt;/p&gt;
&lt;p&gt;7.2.3 上人屋顶盖板要安排专人守护，非工作人员不得进入，下班应及时锁好盖板，防止无关人员进入施工现场。&lt;/p&gt;
&lt;p&gt;7.2.4 组织工人尤其是新进场工人（包括分包队伍）结合现场实际情况进行安全生产规章制度和安全技术操作规程学习，搞好安全生产&amp;quot;三级&amp;quot;教育，对所有施工人员进行安全交底，并对高空作业的工人进行体检，严禁恐高症者、禁忌病症者进入高空现场。以确保安全施工。&lt;/p&gt;
&lt;p&gt;7.2.5 做好防暑降温工作。&lt;/p&gt;
&lt;p&gt;7.2.5 严禁酒后和带病作业。&lt;/p&gt;
&lt;p&gt;7.2.6 工前对机具进行试用转，保证机具性能良好。&lt;/p&gt;
&lt;p&gt;7.2.7 架设上下安全梯架、通道，并保证牢固、稳定、安全性。&lt;/p&gt;
&lt;p&gt;7.2.8 梯架、通道、支撑架体严禁堆放材料杂物，确保梯架通道顺畅。必要时必须张挂安全网。&lt;/p&gt;
&lt;p&gt;7.2.9 起吊构件、料具要捆、锁、扣紧固牢靠，设有专人指挥。操作人员要听从指挥，服从信号。紧密配合。&lt;/p&gt;
&lt;p&gt;7.2.10 严禁利用起吊设备、升降设施运送上下人员。吊物未放稳时不得攀爬，起重物下严禁站人和人员通过。&lt;/p&gt;
&lt;p&gt;7.2.11 高架使用物资、料具必须放置有序、稳定牢固，以防掉落。&lt;/p&gt;
&lt;p&gt;7.2.12 高空行走、攀爬时严禁手持物件，高空作业不得随手抛落物品，以防伤人。&lt;br /&gt;
7.2.13 脚手架搭设符合规程要求并经常检查维修，作业前先检查稳定性。脚手架卸料平台四周及行人通道两边因设安全网。&lt;br /&gt;
7.2.14 脚手架搭设安全通道，通道不得堆放过多物件，两边设置安全网，垃圾和废料及时清理运走。&lt;br /&gt;
7.2.15 遇有五级以上大风及恶劣天气时应停止高空作业。&lt;br /&gt;
7.2.16 当现场需要焊接时，焊接部位下面屋面应铺木板防止屋面起火。&lt;/p&gt;
&lt;p&gt;7.2.17 工地应设置消防管理器材，并加强对用火制度的管理。以预防火灾的发生。&lt;/p&gt;
&lt;p&gt;7.2.18 高架构造物应设避雷装置。&lt;/p&gt;
&lt;p&gt;7.2.19 施工现场设置安全警告标志。&lt;/p&gt;
&lt;p&gt;7.2.20 供电线路按&amp;quot;三相五线、三级管理、二级保护&amp;quot;的要求分别供电。&lt;/p&gt;
&lt;p&gt;7.2.21 配合安全检查，对安全检查人员安全要求必须坚决服从、认真执行。&lt;/p&gt;            </description>
            <pubDate>2026-05-14 05:08:56</pubDate>
            <link>https://www.syuez.com/blog/%E6%A5%BC%E9%A1%B6%E9%92%A2%E7%BB%93%E6%9E%84%E5%B9%BF%E5%91%8A%E7%89%8C%E6%96%BD%E5%B7%A5%E6%96%B9%E6%A1%88.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E6%A5%BC%E9%A1%B6%E9%92%A2%E7%BB%93%E6%9E%84%E5%B9%BF%E5%91%8A%E7%89%8C%E6%96%BD%E5%B7%A5%E6%96%B9%E6%A1%88.html</guid>
                                               <category>招投标</category>
                                    </item>
                <item>
            <title>钢桥制造安全技术交底</title>
            <description>
            &lt;!--
author: admin
date: 2024-04-10
title: 钢桥制造安全技术交底
tags: 钢桥
category: 招投标
status: publish
summary: 招投标~
--&gt;
&lt;h3&gt;2.14.1 钢桥制造安全技术交底&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;剪冲或切割后的工件，应倒钝，并将飞边、毛刺、挂渣、飞溅物等锐利物清除干净。操作人员不得用手清除。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;经矫正符合设计要求的杆件应堆放在平整、坚实、不积水的场地上，并应按施工设计规定设置支墩；支墩必须稳固。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;放样应在坚固的放样台上进行；作业中，严禁抛掷工具；燃割工件时，应合理布置垫块，且不得使用方木等易燃物作垫块，确保工件燃割后的稳定。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;钢材堆放场地应平整、坚实、不积水，并设防雨、雪设施；码垛高度应由地基承载力确定，且不宜超过1.2m；钢材应按品种、型号、规格分类整齐码放；每排垛之间应有安全通道，其宽度应满足运输车辆要求，且不小于1.5m；每层应隔垫，确保吊装穿绳的安全操作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;切削作业时操作人员应站在切屑飞溅范围之外，刀具未停止运转之前操作人员不得触摸工件；加工的工件上不得放置工具和其他杂物，切削作业中不得改变切削方式，不得测量工件；采用刨边机加工坡口，压紧装置必须灵敏可靠，压紧器必须有足够的夹紧力；装卸工件时必须将刀具退到安全位置。大型工件装卸时应使用起重设备，当工件平稳地放置在平台上并卡牢后，方可摘钩。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;加工钢桥使用的钢材、焊接材料、涂装材料和紧固件应符合设计要求和现行国家标准的规定。材料进场时应有生产企业的质量合格证明书，并应按合同要求和国家标准进行检查和验收，确认合格，形成文件；钢桥应在具有资质的钢结构制造企业制造，并按提前编制好的方案，规定杆件制作、组装、试拼装、涂装的工艺和相应的安全技术措施；在钢桥制作的同时应加工制作桥上施工临边防护设施，并履行质量验收手续，确认合格，并形成文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;钢桥制作场地应平整、坚实，宜采用刚性地面，其承载力应满足要求，不得有影响钢材吊装的建(构)筑物、架空线等障碍物；在露天场地制作，应有防雨、雪设施，周围应设护栏，非施工人员禁止入内；钢桥制作宜在具备相应条件的车间内加工；加工机具、材料、工件等应合理布置，电气接线与拆卸必须由电工负责，并应符合施工用电安全技术交底具体要求；钢桥制作场地应经检查、验收合格后，方可投入使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;钢桥制作使用的工作台和工装胎具应满足钢桥制作要求，其强度、刚度和稳定性应满足钢桥制作中的安全要求；工作台和工装胎具应按施工组织设计规定制作；制作完成后，必须经验收确认合格，并形成文件；工装胎具和加工杆件总高度在2m(含)以上应设临边防护设施；必要时应在工装胎具侧面支搭作业平台，支搭作业平台应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 作业平台的脚手板必须铺满、铺稳。&lt;/p&gt;
&lt;p&gt;(2) 搭设与拆除脚手架应符合脚手架安全技术交底具体要求。&lt;/p&gt;
&lt;p&gt;(3) 使用前应经检查、验收，确认合格并形成文件。使用中应随时检查，确认安全。&lt;/p&gt;
&lt;p&gt;(4) 作业平台临边必须按要求设防护栏杆；上下作业平台必须设安全梯、斜道等攀登设施。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;剪切、冲裁工件作业时，应根据钢板的尺寸和质量确定吊具和操作人数；两人(含)以上作业时，应由一人指挥；剪切窄板时，应使用宽度、厚度符合要求的压垫板压紧；不得将数层钢板叠在一起剪切和冲裁，并应根据加工钢板的厚度调整剪刃间隙；操作人员双手距刃口或冲模应保持20cm以上的距离，不得将手置于压紧装置或待压工件的下部；送料时必须在剪刀、冲刀停止动作后进行；作业过程中出现异常情况，必须立即关机断电；排除故障后，应经检查确认安全方可继续作业。严禁机械带病作业。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装、使用加工机械应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 使用期间应建立维护、保养、检查制度，保持完好。&lt;/p&gt;
&lt;p&gt;(2) 机械操作人员和配合作业人员应协调一致，相互配合。&lt;/p&gt;
&lt;p&gt;(3) 加工机械应在使用说明书规定的适用范围内，按操作规程操作。&lt;/p&gt;
&lt;p&gt;(4) 机械周围不得有影响操作的障碍物，室外作业应设防雨、雪棚。&lt;/p&gt;
&lt;p&gt;(5) 加工机械应设专人管理，操作人员必须经安全技术培训，考核合格方可上岗。&lt;/p&gt;
&lt;p&gt;(6) 两班以上作业应建立交接班制度，确认安全并形成文件；作业后必须关机断电，清洁机械、清扫现场。&lt;/p&gt;
&lt;p&gt;(7) 机械应安装在坚实的基础上，安装完毕后应按机械说明书的规定进行检测和试运转，经验收合格后方可使用；机械的防护装置应齐全、有效。&lt;/p&gt;
&lt;p&gt;(8) 机械运行中发现异常或故障，必须立即关机断电，并进行检修；检修后应经检查、试运行确认安全，方可继续使用；严禁机械带病运转和在运转中维修。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;气割加工现场应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 气割作业场地周围10m范围内不得堆放易燃易爆物品，不能满足时，必须采取隔离措施；加工现场必须按消防部门的规定配置消防器材。&lt;/p&gt;
&lt;p&gt;(2) 作业现场用气量应随用随供，不宜多存。露天作业时，乙炔瓶、氧气瓶等应搭设防护棚；风力五级(含)以上天气不得露天作业。&lt;/p&gt;
&lt;p&gt;(3) 现场宜设各种气瓶的专用库，并建立领发料制度；气割作业现场应通风良好，能及时排除有害气体、灰尘、烟雾。&lt;/p&gt;
&lt;p&gt;(4) 作业前应履行用火申报手续，经消防管理人员检查，确认防火措施落实，并签发用火证。作业中应随时检查，确认无隐患。作业后必须清除火种，作业人员方可离开现场。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用钢丝绳吊装钢板时，应采取防止钢丝绳滑移的措施；钢丝绳与钢板棱边间应采用塑性材料垫衬；吊装钢板、型钢应使用专用吊具，并保持两吊索夹角不大于120°，大型钢板应采用横吊梁吊装；用自制吊具安装构件时，应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 自制吊具应纳入机具管理范畴，由专人管理，定期检修、维护，保持完好。&lt;/p&gt;
&lt;p&gt;(2) 使用前作业人员必须对其进行外观检查、试用，确认安全。&lt;/p&gt;
&lt;p&gt;(3) 自制吊具应由专业技术人员设计，由项目经理部技术负责人核准；自制吊具宜在加工厂由专业技工制作，经质量管理人员跟踪检查，确认各工序合格，并形成文件；制作完成后必须经验收、试吊，确认合格，并形成文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;钢桥试拼装应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 试拼装场地应平整、坚实，面积和承载力应满足试拼装要求。&lt;/p&gt;
&lt;p&gt;(2) 试拼装应由具有经验的专业技术人员主持；吊装作业必须由信号工指挥。&lt;/p&gt;
&lt;p&gt;(3) 试拼装现场附近有电力架空线路时，应设专人监护，确认运输机械与电力架空线路的最小距离必须符合表2-27的要求。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;media/image1.png&quot; alt=&quot;&quot; /&gt;{width=&amp;quot;6.6875in&amp;quot; height=&amp;quot;1.2416666666666667in&amp;quot;}&lt;/p&gt;
&lt;p&gt;(4) 吊装时，被吊杆件(梁段)上严禁有人；杆件四角应加设缆风绳，保持稳定；起重机吊装应符合起重机相关安全技术交底具体要求。&lt;/p&gt;
&lt;p&gt;(5) 对孔时，应用冲钉探孔，严禁手指探入。&lt;/p&gt;
&lt;p&gt;(6) 作业前应根据杆件形状、尺寸、质量选择适宜的起重机。&lt;/p&gt;
&lt;p&gt;(7) 试拼装现场应划定作业区，非作业人员严禁入内；试拼装时应采取防倾覆措施。&lt;/p&gt;
&lt;p&gt;(8) 试拼装时必须在前杆件(梁段)拼装稳固，确认安全后方可进行后杆件(梁段)的拼装。&lt;/p&gt;
&lt;p&gt;(9) 杆件(梁段)就位应缓慢、平稳、准确。在距离就位点5cm～10cm的空间位置应暂停，使用工具辅助就位；严禁碰撞已装杆件(梁段)；严禁手推、脚蹬辅助就位。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运输、储存氧气瓶和乙炔瓶应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 油脂和油污等易燃物品不得与氧气同车运输。&lt;/p&gt;
&lt;p&gt;(2) 乙炔气瓶必须按规定期限储存，不得放置在有射线辐射的场所。&lt;/p&gt;
&lt;p&gt;(3) 运输气瓶应挂&amp;quot;危险品&amp;quot;标志；并严禁在车辆、行人稠密地区、学校、娱乐和危险场所停置。&lt;/p&gt;
&lt;p&gt;(4) 运输气瓶时应检查瓶帽，确认旋紧，并应轻装、轻卸，严禁用肩扛、背负、拖拉、抛滑等易造成碰、撞的搬运方法，严禁用吊车吊运氧气瓶。&lt;/p&gt;
&lt;p&gt;(5) 汽车运输气瓶应妥善固定，宜头朝同一方向横向放置，不得超过车厢高度；车厢内严禁乘人，严禁烟火，并随车备有灭火器材和防毒面具；夏季应有遮阳措施，严禁暴晒。&lt;/p&gt;
&lt;p&gt;(6) 储存气瓶的库房必须专人管理，并建立管理制度；储存气瓶的库房必须符合消防有关规定；储存气瓶的库房，地面应平坦、防滑、有良好通风条件，且温度不得超过40℃；照明设施应具有防爆性能，电气开关和熔断器等应设在库房外，并应设避雷装置。&lt;/p&gt;
&lt;p&gt;(7) 气瓶入库前必须进行检查，确认符合规定要求；气瓶在库中应放置整齐，妥善固定，并留有通道；卧放时应头朝同一方向，挡掩牢固；气瓶在储存时必须与易燃、可燃物隔离，且与易引燃的材料(如木屑、纸张、油脂等)距离6m以上，或用高于1.6m的不可燃屏板隔离。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;机械矫正工件应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 使用滚(平)板机矫正钢板时，操作人员必须站在机床两侧.严禁站在机床前后或站在钢板上。&lt;/p&gt;
&lt;p&gt;(2) 矫正小块钢板时，应在其下垫以能满足机械要求的钢垫扳，垫板一端与轧辊距离不得小于30cm，并不得偏斜。&lt;/p&gt;
&lt;p&gt;(3) 矫正大型工件时，操作人员不得用手把持工件，应站在工件可能偏斜、偏移、翻滚的范围之外，发现异常情况应立即关机，及时采取措施，并确认工件稳固。&lt;/p&gt;
&lt;p&gt;(4) 作业结束后必须关机断电，保养机械，清扫现场。&lt;/p&gt;
&lt;p&gt;(5) 使用压力矫正工件时，工件应放置在承压台正中；遇有偏心和斜面的工件，应压在工件的重心位置上，并应对工件采取稳定措施。&lt;/p&gt;
&lt;p&gt;(6) 机械矫正时，工件应放置平稳，设专人指挥；工件表面应保持清洁，不得有熔焊的金属渣；钢板出现滚偏时，必须关机断电后方可进行调正。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;杆件矫正必须由作业组长统一指挥；矫正前杆件应放置稳固，矫正过程中应随时观察，确认正常；发现异常情况，必须立即停止矫正，经处理确认杆件稳定后，方可继续矫正；采用冷矫工艺应符合机械矫正工件相应要求，并应缓慢加压，随时观察杆件的变形情况，保持杆件的稳定；采用燃炬加热矫正应符合气割加工设备相应安全要求，采用多台(个)燃炬加热时，操作人员必须相互照应，并保持3m以上的作业距离。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;气割加工设备应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 作业结束后必须关闭氧气瓶、旋紧安全阀，并将使用设备放置在安全处，检查作业场地，确认无火灾隐患，方可离场。&lt;/p&gt;
&lt;p&gt;(2) 操作者必须经专业培训，持证上岗；数控、自动、半自动切割加工设备应实行专人专机制度；作业人员必须按规定穿戴工作服、手套、护目镜等防护用品。&lt;/p&gt;
&lt;p&gt;(3) 气瓶及其附件、软管、气阀与割炬的连接处应牢固，不得漏气；使用前和作业中应用皂水检查，确认严密；严禁用明火检漏；气割胶管应妥善固定，禁止与焊接电缆、钢丝绳等绞在一起。&lt;/p&gt;
&lt;p&gt;(4) 作业中氧气瓶、乙炔瓶和割炬相互间的距离不得小于10m；同一处有两个以上乙炔瓶时，其相互间距不得小于10m；不能满足上述要求时，应采取隔离措施；作业中不得手持连接胶管的割炬爬梯、登高，胶管不得缠身；严禁割具对向人、设备和设施。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;制孔应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 严禁触摸旋转的刀具和在刀具下翻转、卡压、测量工件。&lt;/p&gt;
&lt;p&gt;(2) 后孔法制孔，必须将杆(工)件和制孔设备支垫稳固；制孔设备应有足够的作业空间。&lt;/p&gt;
&lt;p&gt;(3) 制孔前，应检查钻床和夹具，确认安全；制孔时，钢板必须卡牢，钢板不得有位移和震动；工件上、机床上不得放置其他物件。&lt;/p&gt;
&lt;p&gt;(4) 手动进钻、退钻时，应逐渐增压或减压，不得在手柄上加套管进钻；钻头上缠有铁屑时，应停车用刷子清除，不得直接用手清除。&lt;/p&gt;
&lt;p&gt;(5) 制孔结束后必须关机断电，待钻床与工件脱离后，方可吊装杆(工)件；制孔后的飞刺、铁屑、污垢应及时清除。&lt;/p&gt;
&lt;p&gt;(6) 铰孔、扩孔或量测孔径拨取量棒(量规)时，不得用力过猛；使用摇臂钻制孔，横臂必须卡紧，横臂回转范围不得有障碍物。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;杆件焊接应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 焊接前必须办理用火申报手续，经消防管理人员检查确认焊接作业安全技术措施落实，颁发用火证后，方可进行焊接作业。&lt;/p&gt;
&lt;p&gt;(2) 所有焊缝必须进行外观检查，不得有裂纹、未熔合、夹碴、未填满弧坑和超出规定的缺陷。零部(杆)件的焊缝应在焊接24h后按技术规定进行无损检验。&lt;/p&gt;
&lt;p&gt;(3) 焊接施工作业现场应符合下列要求：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1) 露天焊接作业，焊接设备应设防护棚。

2) 二氧化碳气体保护焊露天焊接时，应设挡风屏板。

3) 焊接作业现场应按消防部门的规定配置消防器材。

4) 焊接辐射区，有他人作业时，应用不可燃屏板隔离。

5) 焊接作业现场应设安全标志，非作业人员不得入内。

6) 焊接作业现场应通风良好，能及时排除有害气体、灰尘、烟雾。

7) 焊接作业现场周围10m范围内不得堆放易燃易爆物品，不能满足时，必须采取隔离措施。&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(4) 焊接作业应符合下列要求：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1) 电焊机的二次引出线、焊把线、电焊钳等的接头必须牢固。

2) 电焊机的电源缆线长不得大于5m，二次引出线长不得大于30m。

3) 长期停用的电焊机，使用前必须检验，绝缘电阻不得小于0.5MΩ，接线部分不得有腐蚀和受潮现象。

4) 作业时，电缆线应理顺，不得身背、臂夹、缠绕身体，严禁搭在电弧和炽热焊件附近与锋利的物体上。

5) 使用中的焊接设备应随时检查，发现安全隐患必须立即停止使用；维修后的焊接设备，经检查确认安全后，方可继续使用。

6) 操作者必须经专业培训，持证上岗。数控、自动、半自动焊接设备应实行专人专机制度；焊工作业时必须使用带有滤光镜的头罩或手持防护面罩，戴耐火的防护手套，穿焊接防护服，穿绝缘、阻燃、抗热防护鞋；清除焊渣时应戴护目镜。

7) 电焊机、电缆线、电焊钳应完好，绝缘性能良好，焊机防护装置齐全有效；使用前应检查，确认符合要求。

8) 作业时不得使用受潮焊条；更换焊条必须戴绝缘手套；合开关时必须戴干燥的绝缘手套，且不得面向开关。

9) 作业中电机出现声响异常、电缆线破损、漏电征兆时，必须立即关机断电，停止使用，维修后经检查确认安全，方可继续使用。

10) 在狭小空间作业时必须采取通风措施，经检测确认氧气和有毒、有害气体浓度符合安全要求并记录后，方可进入作业；出入口必须设人监护，内外呼应，确认安全；作业人员应轮换作业；照明电压不得大于12V。

11) 作业后必须关机断电，并锁闭电闸箱。&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;焊缝无损检测人员必须经无损探伤专业培训，取得无损检测资格；放射检测时现场应设屏蔽，在放射源周围应设明显标志，严禁人员靠近；检测人员必须按规定佩戴专用防护用品；放射检测应远距离操作，工作地点应置于辐射强度最小的部位，避免在辐射流的正前方工作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;杆件组装应符合下列要求：&lt;/p&gt;
&lt;p&gt;(1) 楔具应焊牢，拆楔应切割、磨平，不得锤击打落。&lt;/p&gt;
&lt;p&gt;(2) 主梁上翼板未组装封盖前严禁人员站在腹板上作业。&lt;/p&gt;
&lt;p&gt;(3) 人孔和梁端部位应设安全标志，夜间和阴暗时应设警示灯。&lt;/p&gt;
&lt;p&gt;(4) 向工装胎具上搬运小型工件和工具，应直接传递，不得抛掷。&lt;/p&gt;
&lt;p&gt;(5) 工件和临时装置的锐边、锐角应倒钝，飞边、毛刺、污垢应清除。&lt;/p&gt;
&lt;p&gt;(6) 杆件组装时，必须使用刚性材料临时固定，严禁使用钢丝绳固定工件。&lt;/p&gt;
&lt;p&gt;(7) 组装大型杆件应使用起重设备，起落工件应缓慢、匀速，避免工装胎具受冲击荷载或集中荷载。&lt;/p&gt;
&lt;p&gt;(8) 在胎具上铺设直立、斜置、上置的工件时，应在胎具上设防止工件倾倒、翻转、坠落、位移的临时固定装置。&lt;/p&gt;
&lt;p&gt;(9) 杆件组装时，应由作业组长统一指挥，各工位协调配合；杆件组装应按施工方案、工艺规定设临时支撑和紧固件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;拆除杆件应由起重机械进行，拆除前应检查环境，确认安全；拆除工作应由专业技术人员主持、信号工指挥；拆除现场应设作业区，非作业人员不得入内；拆除杆件的堆放应在平整、坚实、不积水的场地上，并应按施工设计规定设置支墩，支墩必须稳固。&lt;/li&gt;
&lt;/ol&gt;            </description>
            <pubDate>2026-05-14 05:08:57</pubDate>
            <link>https://www.syuez.com/blog/%E9%92%A2%E6%A1%A5%E5%88%B6%E9%80%A0%E5%AE%89%E5%85%A8%E6%8A%80%E6%9C%AF%E4%BA%A4%E5%BA%95.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E9%92%A2%E6%A1%A5%E5%88%B6%E9%80%A0%E5%AE%89%E5%85%A8%E6%8A%80%E6%9C%AF%E4%BA%A4%E5%BA%95.html</guid>
                                               <category>招投标</category>
                                    </item>
                <item>
            <title>发光字施工方案</title>
            <description>
            &lt;!--
author: admin
date: 2023-12-23
title: 发光字施工方案
tags: 发光字
category: 招投标
status: publish
summary: 招投标~
--&gt;
&lt;h1&gt;中煤平朔集团办公楼亚克力LED发光字制作安装工程&lt;/h1&gt;
&lt;h2&gt;施 工 组 织 设 计&lt;/h2&gt;
&lt;h2&gt;一、工程说明：&lt;/h2&gt;
&lt;p&gt;根据中煤平朔集团有限公司要求在中煤平朔办公楼顶安装一套发光字。由于大楼已经投入使用，且施工作业点在外墙楼顶处，施工作业时应尽量减少对大楼整体的影响，同时，也要保证施工安全文明。为方便施工，本工程主要工厂制作现场安装施工作业，材料利用室内电梯运输和吊运至施工场所。&lt;/p&gt;
&lt;h2&gt;二、工程概况：&lt;/h2&gt;
&lt;p&gt;1、工程名称：中煤平朔集团办公楼亚克力LED发光字制作安装工程&lt;/p&gt;
&lt;p&gt;2、工程位置：中煤平朔办公楼顶&lt;/p&gt;
&lt;p&gt;3、具体尺寸：红色吸塑字字体规格6m*5m,6组，合180㎡。&lt;/p&gt;
&lt;h2&gt;三、工艺流程：&lt;/h2&gt;
&lt;p&gt;工艺流程：工厂制作组装——现场后背斜支撑钢结构龙骨制作、安装——现场大字安装——孔洞保护及PVC线管布置——施工现场清洁——工程验收。&lt;/p&gt;
&lt;h2&gt;四、工程施工&lt;/h2&gt;
&lt;p&gt;1、所有字体制作组装分别在工厂加工，现场安装。&lt;/p&gt;
&lt;p&gt;2、工期：22天。&lt;/p&gt;
&lt;h2&gt;五、施工要求&lt;/h2&gt;
&lt;h3&gt;1、施工准备&lt;/h3&gt;
&lt;p&gt;（1）施工前认真组织职工熟悉现场，学习相关规范和技术要求。&lt;/p&gt;
&lt;p&gt;（2）将施工设计与现场实际情况进行认真仔细核对。&lt;/p&gt;
&lt;p&gt;（3）做好安全防护准备工作，现场围档施工，配备现场安全防护指挥人员。&lt;/p&gt;
&lt;h3&gt;2、制作方案&lt;/h3&gt;
&lt;p&gt;2.1、所用材料根据甲方和实际施工的要求：
1）钢结构主架用40角钢19.2t焊接，除锈刷防锈漆2道。
2）用1.2mm镀锌钢板180㎡等离子切割、焊接字壳，内装鸿之舞牌LED光源180㎡，每平米160个光源模块。
3）安装时主架脚部用16#膨胀螺栓固定。
4）亚克力吸塑字电源采用鑫威达牌400w专用变压器21台，2*1.5离石电源护套线400m。&lt;/p&gt;
&lt;p&gt;2.2、任何施工人员不得擅自修改设计和更改相关技术要求，遇到疑问，及时与技术人员协调，取得相关负责人员同意才能继续施工。&lt;/p&gt;
&lt;p&gt;2.3、各种型材制作前必须较正，面板需在制作平台上进行，并且设置必需的一些工装夹具，以保证制作质量，确保尺寸准确和表面平整。&lt;/p&gt;
&lt;p&gt;2.4、制作时必须严格按照施工工艺和有关规范进行。&lt;/p&gt;
&lt;p&gt;2.5、制作过程中，应严格注意测量，定位，划线。&lt;/p&gt;
&lt;p&gt;2.6、放样与下料应根据工艺要求，须留制作和安装时所需要的焊接伸缩全量。&lt;/p&gt;
&lt;h3&gt;3、钢结构制作&lt;/h3&gt;
&lt;p&gt;3.1、根据本工程员的实际情况，制作一个工作平台，以便施工时进行放样，拼装和焊接。&lt;/p&gt;
&lt;p&gt;3.2、按设计要求尺寸进行放样，双拼，及承载架，需间断焊接，以防止焊接变形。焊接时严格按照《钢结构施工验收规范》和《钢结构工程检验评定标准》进行施工，确保焊接质量，不得出现咬边、气泡、夹渣，漏焊等不良现象，焊接宽度应符合设计要求。&lt;/p&gt;
&lt;p&gt;3.3、将做好的底板和加强筋板与立柱焊好为焊接时应注意筋板的定位及方向。&lt;/p&gt;
&lt;p&gt;3.4、施工前钢材必须除绣，将基层清理干净，并刷防绣漆二度。&lt;/p&gt;
&lt;p&gt;3.5、高空作业必须搭设脚手架并设置安全防护栏，安全网，并符合高空安全焊业规范要求。&lt;/p&gt;
&lt;p&gt;3.6、任何施工人员不得擅自修改设计及其它技术要求，施工应严格遵守图纸和规范，如有疑问，必须取得发包方和设计人员同意后才能继续施工。&lt;/p&gt;
&lt;p&gt;3.7、在操作平台上进行施样，将下好的料进行组装，当全部点焊为后再是行焊接，焊接时应按应力变化情况对特焊接，严防变形。&lt;/p&gt;
&lt;h3&gt;4、安装要求&lt;/h3&gt;
&lt;p&gt;4.1、安装时，必须按图施工，焊缝要求，一定达到设计要求厚度，焊接时不得出现灰渣，气泡等焊接&lt;/p&gt;
&lt;p&gt;4.2、安装时，质检人员应随时对安装质量进行检查控制，安装质量检查合格后，才能进行下一步安装。&lt;/p&gt;
&lt;h3&gt;5、焊接要求&lt;/h3&gt;
&lt;p&gt;5.1、工程施工实行三级质量检验制度，并实行工序检验，只有上道工序合格后才能进行下道工序施工。&lt;/p&gt;
&lt;p&gt;5.2、焊接用的焊条必须是质量合格的产品，以保证焊接质量。&lt;/p&gt;
&lt;p&gt;5.3、所有焊接必须符合图纸设计及钢结构验收规范的要求，确保合格率为100%。&lt;/p&gt;
&lt;h2&gt;六、安全保证措施&lt;/h2&gt;
&lt;p&gt;以“建筑安装工程安全技术规程”南京市建筑业施工现场化管理规定和“施工现场安全生产十项措施”等各项安全管理规章制度为准绳，实行安全生产管理，坚持做管生产必须管安全。&lt;/p&gt;
&lt;p&gt;1、认真执行安全生产责任制，成立以项目经理为组长，专（兼）职安全员及有关人员参加的安全领导小组进行安全生产监督检查，开展安全生产活动。&lt;/p&gt;
&lt;p&gt;2、施工技术人员必须熟悉本工程的情况，具有一定的专业技术水平和施工经验，牢固树立“安全第一，预防为主”的思想，严格贯彻执行国家颁布的《建筑安装工程技术规程》&lt;/p&gt;
&lt;p&gt;3、坚持做到安全技术交底单不施工，工长对所负责的项目（或工序）必须下达书面的有针对性的安全技术交底单。&lt;/p&gt;
&lt;p&gt;4、坚持做好进场工人的安全教育工作，坚持特殊工种必须持证上岗。&lt;/p&gt;
&lt;p&gt;5、施工中脚手架必须符合有关的安全要求。&lt;/p&gt;
&lt;p&gt;6、夜间施工的作业场，均需设置足够的照明，并要求相应的固定。&lt;/p&gt;
&lt;p&gt;7、高空施工必须参照《建筑施工高处作业安全技术规程》进行防护&lt;/p&gt;
&lt;p&gt;8、施工现场用电按南京地区《供电低压电气装置规程》及建设部《施工现场临时用电安全技术规程》进行设计及电箱配置。&lt;/p&gt;
&lt;p&gt;9、所有的手持电动工具应有灵敏可靠的触点保护器。&lt;/p&gt;
&lt;p&gt;10、高空作业严防物体坠落，防护设施应完善。&lt;/p&gt;
&lt;h2&gt;七、计划工期&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;工序&lt;/th&gt;
&lt;th&gt;计划时间&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;字壳焊接&lt;/td&gt;
&lt;td&gt;3天&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;字壳打磨、喷漆&lt;/td&gt;
&lt;td&gt;3天&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;面板制作&lt;/td&gt;
&lt;td&gt;4天&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;光源安装&lt;/td&gt;
&lt;td&gt;2天&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;钢结构现场焊接&lt;/td&gt;
&lt;td&gt;3天&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;大字现场安装&lt;/td&gt;
&lt;td&gt;5天&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;孔洞保护及PVC线管布置&lt;/td&gt;
&lt;td&gt;1天&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;清洁&lt;/td&gt;
&lt;td&gt;1天&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;合计&lt;/td&gt;
&lt;td&gt;22天&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;八、安防措施&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;media/image1.png&quot; alt=&quot;安全图标&quot; /&gt;{width=&amp;quot;1.3333333333333333in&amp;quot; height=&amp;quot;0.4166666666666667in&amp;quot;}&lt;/p&gt;
&lt;h3&gt;1、安全机构管理&lt;/h3&gt;
&lt;p&gt;为树立我司企业形象，确保工程评优，我司将自觉服从业主及物业管理公司对施工现场的安全文明施工管理，并制定安全文明施工措施。同时以“安全第一、预防为主”为原则，以无重大伤亡事故为目标，从安全生产组织、安全教育、安全检查、事故处理等几个方面严格管理，尤其是在高空作业方面采取预防措施，以确保整个施工过程安全、文明、规范。&lt;/p&gt;
&lt;h3&gt;2、一般规定&lt;/h3&gt;
&lt;p&gt;我司将自觉执行有关部门发送业主及物业管理公司的所有关于本工程施工现场的任何意见及通知。&lt;/p&gt;
&lt;p&gt;我司将全面负责工程的安全管理，并根据承诺的安全管理标准建立安全管理机构，成立以施工负责人和项目经理为主要负责人的安全文明施工管理机构，设专职安全负责人，随时接受业主及物业管理公司的安全检查。&lt;/p&gt;
&lt;h3&gt;3、具体措施&lt;/h3&gt;
&lt;h4&gt;● 搞好安全生产教育&lt;/h4&gt;
&lt;p&gt;自觉按照有关规定对本工程施工人员做好安全教育，以提高工作人员安全生产思想意识和防护能力，坚决杜绝违章指挥和违章操作，以确保施工及人身安全。&lt;/p&gt;
&lt;h4&gt;● 落实劳动保护制度&lt;/h4&gt;
&lt;p&gt;施工现场人员须佩戴安全带、安全帽及防护靴等劳动保护用品。&lt;/p&gt;
&lt;p&gt;我司将为安装施工现场提供合理合格的照明、护栏、通道、警告标志、守卫设施、安全网等防护装置，并确保符合市容管理要求。&lt;/p&gt;
&lt;h4&gt;● 建立日常的安全检查制度&lt;/h4&gt;
&lt;p&gt;项目经理及安全负责人将组织有关人员对现场施工机具、电气设备、作业环境、人员操作安全性等进行检查。对于检查出的问题，及时提出整改措施，并限期落实整改。&lt;/p&gt;
&lt;h4&gt;● 卫生管理&lt;/h4&gt;
&lt;p&gt;我司将根据业主及物业管理公司要求保持现场整洁、有序。在施工过程中将随时清理安装施工现场的废料、垃圾、雨水、污水等，在各部位移交前，根据需要逐步转移多余的部件和材料，清除垃圾及各种临时设施，使所施工工程及工地保持整洁，达到文明标准。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;media/image2.png&quot; alt=&quot;卫生管理图标&quot; /&gt;{width=&amp;quot;1.5416666666666667in&amp;quot; height=&amp;quot;0.2222222222222222in&amp;quot;}&lt;/p&gt;
&lt;h4&gt;● 安全保卫&lt;/h4&gt;
&lt;p&gt;配合物业管理公司负责工程的现场安全保卫工作，合理安排保卫人员值班，做好现场防盗工作。&lt;/p&gt;
&lt;h4&gt;● 防火检查&lt;/h4&gt;
&lt;p&gt;将负责工程的现场防火工作，并根据国家有关规定自备并布置消防器材，设专职消防员，定期进行防火检查，以保证消防通道畅通，做好现场的防火工作。一旦发现隐患必须立即消除。高空焊接作业亦应注意防火。焊接连接件时，地面设专人检查并采取有效预防措施，并将地面易燃物品清理干净、易爆物品转移到安全地带，以防止焊渣引发着火。&lt;/p&gt;
&lt;h4&gt;● 高空作业&lt;/h4&gt;
&lt;p&gt;由于工程安装属高空作业项目，如何认识高空施工作业的复杂性和危险性以及危险部位，预防事故的发生将成为本工程安全施工的关键。为此，在下达施工任务的同时将进行全面交底，向所有施工人员讲清施工方法和安全注意事项。&lt;/p&gt;
&lt;p&gt;对于使用吊篮安装的部位，项目经理及施工队长应亲自带班，并自上而下全面检查各关键部位是否存在隐患，严禁吊篮带病运行。工作钢缆和安全钢缆、安全保险器是决定吊篮安全与否的关键，一旦发现有磨损、断丝和电气焊烧断达5%的应立即更换。同时严格检查吊篮施工作业人数和额度荷载。为保证作业安全，同时在吊篮工作人员不能超过四人，所载物品和人员总重量也不能超过额定荷载。在雨天或风力超过6级的天气不能使用吊篮高空作业。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;media/image1.png&quot; alt=&quot;高空作业图标&quot; /&gt;{width=&amp;quot;1.2361111111111112in&amp;quot; height=&amp;quot;0.3888888888888889in&amp;quot;}&lt;/p&gt;
&lt;h4&gt;● 安全环保措施&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;安全制度&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1、安全生产管理体系：施工单位各级主管领导、职能部门、工程技术人员、岗位操作人员在劳动生产过程中层层负责，建立安全责任制。安全生产工作在施工单位负责人的领导下，各级领导，各职能部门层层控制，项目经理负责现场管理，并要求每个职工的安全职责是遵章守纪，不违章作业，并能组织他人违章作业；安全生产责任制坚持“横向到边”、“纵向到底”原则，明确各级领导，各只能部门，所有操作者和管理者的安全责任，是安全工作层层有人负责；&lt;/p&gt;
&lt;p&gt;2、基层施工技术员安全生产责任：认真执行上级有关安全技术、劳动卫生工作的各项规定，对自己负责的施工区域职工的安全、健康负责；在生产的计划、布置、检查、总结、评比中，必须同时把安全工作贯穿到每个具体环节中去，保证在安全条件下进行生产；组织职工学习安全操作规程，并抽考、检查执行情况。对严格遵守安全规章制度，避免事故者，提出奖励意见，对违章蛮干、造成事故者，提出惩罚意见；领导本施工区域的班组开展每周的安全日活动，经常对职工进行安全声生产教育、推广安全生产经验；发生工伤事故后，应立即上报，负责查明原因，提出重发的防范措施；监督检查职工正确使用个人劳保用品。&lt;/p&gt;
&lt;p&gt;3、安全生产教育制度：新工人入场前应接受三级教育，即对新入场的工人，必须接受公司、项目经理部、施工队和班组三级的安全教育；对与特殊工种应进行专门教育；经常性举行安全生产活动教育。如安全活动日，事故现场会、分析会，安全技术专题讲座等。&lt;/p&gt;
&lt;p&gt;4、安全生产检查制度：检查工地项目部安全规章制度、特殊工种岗位合格证、施工组织设计和安全技术措施、安全交底、安全活动记录等安全生产资料；检查安全帽、安全带等是否坚持正确使用；检查各种施工机械性能是否良好、安全装置是否齐全有效；检查施工用点的线路、闸箱、接零接地、漏电保护装置是否符合有关规定；检查各种材料、物品是否妥善堆放和保管；明火管理是否符合有关规定，防火工具和设施是否齐全；检查各交叉施工和工种间配合施工，是否存在安全问题。&lt;/p&gt;
&lt;p&gt;5、防火制度：严肃执行《中华人民共和国消防条例》和公安部门关于建筑工地防火的基本措施，加强消防工作领导，现场设消防值班人员，对进场员工进行消防知识教育；各种易燃易爆材料的堆放和保管应与明火区有一定的防火间距；严禁用场内通道堆放材料；配备消防器材，并有专人管理并定期检查；安全用电，严格按照有关规定安装和使用电气设备；&lt;/p&gt;
&lt;p&gt;6、作业人员进场前，必须学习现场的安全规定，遵守业主、监理、总包等各单位制定的规章制度，进行安全技术交底；广泛宣传、教育作业人员牢固树立“安全第一”的思想，提高安全意识；&lt;/p&gt;
&lt;p&gt;7、必须随时携带和使用安全帽和安全带，防止机具、材料的坠落；&lt;/p&gt;
&lt;p&gt;8、作业时要穿整洁合体并适合作业特点的工作服，不得裸身作业，要穿适合作业特点的工作鞋，不得穿凉鞋、拖鞋；&lt;/p&gt;
&lt;p&gt;9、凡要带入楼内的机械事先必须接受安全检查，合格后方可使用。另外携带电动工具时，必须在作业前先作自我检查，在进入场地时将检查记录交甲方；&lt;/p&gt;
&lt;p&gt;10、每天作业前后检查所用工具；&lt;/p&gt;
&lt;p&gt;11、作业前清理作业场地，下班后整理场地，不要将材料工具乱放，在作业中断或结束时当天清扫垃圾并投放到指定地点；&lt;/p&gt;
&lt;p&gt;12、不得随意拆除吊篮或防护架等临时作业设施，不得已必须拆除防护架或搭板时，需得到安全人员的允许，作业结束务必复原上述装置；&lt;/p&gt;
&lt;p&gt;13、在电动工具作业时，必须设置防漏电保护装置，配置安全专员；各种防火工具必须齐全并随时可用，定期检查维修和更换；&lt;/p&gt;
&lt;p&gt;14、制定安全奖惩制度并严格执行；&lt;/p&gt;
&lt;p&gt;15、本工程项目设一名专职安全员，各班组一名兼安全员，加强现场监督检查，由施工员和质检员配合进行现场安全管理。&lt;/p&gt;
&lt;p&gt;16、安全生产和防火制度应本着以防范为主的原则，对可能引起事故发生的因素进行控制和排除，避免事故的发生。如有工伤事故发生应采取以下措施：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如有工伤事故发生应立即向安全部门、公司、甲方及有关部门进行报告；&lt;/li&gt;
&lt;li&gt;抢救伤员；&lt;/li&gt;
&lt;li&gt;保护好事故现场；&lt;/li&gt;
&lt;li&gt;排除险情，防止事故扩大；&lt;/li&gt;
&lt;li&gt;组织人员、设置警戒，维护好出事周围的正常秩序。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;现场发生火警火灾时应采取以下措施：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1、要立即组织义务消防人员和职工进行扑救；&lt;/p&gt;
&lt;p&gt;2、立即向消防部门报警，并向消防部门提供火情、电器、易燃易爆物情况和消火栓位置，以便组织有效灭火；&lt;/p&gt;
&lt;p&gt;救火方法要得当：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;电气设备起火：尽快切断电源，用二氧化碳灭火器灭火，不要向电气设备上泼水救火；&lt;/li&gt;
&lt;li&gt;电石库起火：应用黄沙、干粉灭火；&lt;/li&gt;
&lt;li&gt;化学材料起火：要根据起火物质的性质选择灭火方法，并且要注意防止中毒；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3、灭火以后要保护好火灾现场，设专人巡视，以防死灰复燃，并查找火灾原因。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;防火制度&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1、建立文明施工责任制，划分区域，明确各自分担责任，及时清除杂物，保持施工现场整洁；&lt;/p&gt;
&lt;p&gt;2、现场中的各种临时设施、包括办公、生活用房，仓库、材料与构件堆场临时水电管线，要严格按照甲方要求搭设或埋设整齐，不能乱堆乱放，不应占用道路和通道以及施工工作面；&lt;/p&gt;
&lt;p&gt;3、现场水电应有专人管理；&lt;/p&gt;
&lt;p&gt;4、工人操作地点和周围必须清洁整齐，要做到边干活边清理；&lt;/p&gt;
&lt;p&gt;5、制定严格的成品保护措施，严禁损坏污染成品；&lt;/p&gt;
&lt;p&gt;6、现场各种材料要按甲方规定的位置堆放，堆放场地坚实平整，并有排水措施，材料堆放要按品种、规格分类堆放，要求堆放整齐，易于保管和使用；&lt;/p&gt;
&lt;p&gt;7、机械设备应按规定位置安放；&lt;/p&gt;
&lt;p&gt;8、严格遵守安全生产制度，做到安全文明施工；&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;环保措施&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;合理安排作业时间，尽量减少夜间作业，以减少施工时机具噪音污染；避免影响施工现场内或附近居民的休息；&lt;/li&gt;
&lt;li&gt;完成每项工序后，应及时清理施工后滞留的垃圾，比如胶、胶瓶、胶带纸等，保证施工现场的清洁；&lt;/li&gt;
&lt;li&gt;对于密封材料及清洗溶剂等可能产生有害物质或气体的材料，应作好保管工作，并在挥发过期前使用完毕，以免对环境造成影响。&lt;/li&gt;
&lt;/ul&gt;            </description>
            <pubDate>2026-05-14 05:08:55</pubDate>
            <link>https://www.syuez.com/blog/%E5%8F%91%E5%85%89%E5%AD%97%E6%96%BD%E5%B7%A5%E6%96%B9%E6%A1%88.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%8F%91%E5%85%89%E5%AD%97%E6%96%BD%E5%B7%A5%E6%96%B9%E6%A1%88.html</guid>
                                               <category>招投标</category>
                                    </item>
                <item>
            <title>Nginx 配置密码访问</title>
            <description>
            &lt;!--
author: admin
date: 2023-09-27
title: Nginx 配置密码访问
tags: nginx
category: Linux
status: publish
summary: null
--&gt;
&lt;h1&gt;Nginx 配置密码访问&lt;/h1&gt;
&lt;p&gt;需要实现的需求如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nginx 做 Web 服务，但由于安全问题需求，访问网页时需要输入用户名和密码进行认证，效果如下&lt;/li&gt;
&lt;li&gt;服务器系统是 Debian 12&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;index_files/6c87c508-3936-4c17-8183-94e1fb0a9ceb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;安装密码生成工具&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get update
sudo apt-get install apache2-utils&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;添加用户生成和密码&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ htpasswd -c /usr/local/nginx/password username
# 回车后输入密码
# -c 创建一个加密文件&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/7b463362-4d09-4ae1-b128-e01baf2746bb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看生成的用户和密码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/4309828c-34ac-4d0e-978b-0519896151cc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果要修改密码，或者删除密码，请参考下面操作&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ htpasswd -D /usr/local/nginx/password username
# -D 删除指定的用户&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改用户和密码&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ htpasswd -D /usr/local/nginx/password username
$ htpasswd -b /usr/local/nginx/password username pass
# -D 删除指定的用户
# -b htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码
# -p htpassswd命令不对密码进行进行加密，即明文密码&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;配置 Nginx 认证&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-apacheconf&quot;&gt;server {
  listen 80;
  server_name  localhost;
  # ...

  auth_basic &quot;请输入用户和密码&quot;; # 验证时的提示信息
  auth_basic_user_file /usr/local/nginx/password; # 认证文件

  location / {
      root   /var/www;
      index  index.html index.htm;
  }
  # ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启 Nginx 后生效&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文参考：&lt;a href=&quot;https://segmentfault.com/a/1190000023086569&quot;&gt;Nginx配置密码访问-访问网页需输入用户名密码 - 个人文章 - SegmentFault 思否&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Nginx%E9%85%8D%E7%BD%AE%E5%AF%86%E7%A0%81%E8%AE%BF%E9%97%AE.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Nginx%E9%85%8D%E7%BD%AE%E5%AF%86%E7%A0%81%E8%AE%BF%E9%97%AE.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>在SpringBoot中整合使用Netty框架</title>
            <description>
            &lt;!--
author: admin
date: 2023-09-27
title: 在SpringBoot中整合使用Netty框架
tags: Spring,Netty
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;在SpringBoot中整合使用Netty框架&lt;/h1&gt;
&lt;p&gt;Netty 是一个非常优秀的 Socket 框架。如果需要在 SpringBoot 开发的 app 中，提供Socket 服务，那么 Netty 是不错的选择。&lt;/p&gt;
&lt;p&gt;Netty 与 SpringBoot 的整合，我想无非就是要整合几个地方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;让 netty 跟 springboo t生命周期保持一致，同生共死&lt;/li&gt;
&lt;li&gt;让 netty 能用上 ioc 中的 Bean&lt;/li&gt;
&lt;li&gt;让 netty 能读取到全局的配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;整合 Netty，提供 WebSocket 服务&lt;/h3&gt;
&lt;p&gt;这里演示一个案例，在 SpringBoot 中使用 Netty 提供一个 Websocket 服务。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;servlet 容器本身提供了 websocket 的实现，但这里用 netty 的实现 :sparkling_heart:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;添加依赖&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.netty&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;netty-all&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是的，不用声明版本号。因为 &lt;strong&gt;spring-boot-dependencies&lt;/strong&gt; 中已经声明了最新的netty依赖。&lt;/p&gt;
&lt;h4&gt;通过 yaml 配置基本的属性&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;server:
  port: 80

logging:
    level:
      root: DEBUG

management:
  endpoints: 
    web:
      exposure:
        include: &quot;*&quot;

  endpoint:
    shutdown:
      enabled: true

netty:
  websocket:
    # Websocket服务端口
    port: 1024
    # 绑定的网卡
    ip: 0.0.0.0
    # 消息帧最大体积
    max-frame-size: 10240
    # URI路径
    path: /channel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;App 使用了 &lt;strong&gt;actuator&lt;/strong&gt;，并且开启暴露了 &lt;code&gt;shutdown&lt;/code&gt; 端点，可以让 SpringBoot App优雅的停机。 在这里通过 &lt;code&gt;netty.websocket.*&lt;/code&gt; 配置 websocket 服务相关的配置。&lt;/p&gt;
&lt;h4&gt;通过 ApplicationRunner 启动 Websocket 服务&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import java.net.InetSocketAddress;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.HttpVersion;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketServerCompressionHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.springboot.netty.websocket.handler.WebsocketMessageHandler;

/**
 * 初始化Netty服务
 * @author Administrator
 */
@Component
public class NettyBootsrapRunner implements ApplicationRunner, ApplicationListener&amp;lt;ContextClosedEvent&amp;gt;, ApplicationContextAware {

    private static final Logger LOGGER = LoggerFactory.getLogger(NettyBootsrapRunner.class);

    @Value(&quot;${netty.websocket.port}&quot;)
    private int port;

    @Value(&quot;${netty.websocket.ip}&quot;)
    private String ip;

    @Value(&quot;${netty.websocket.path}&quot;)
    private String path;

    @Value(&quot;${netty.websocket.max-frame-size}&quot;)
    private long maxFrameSize;

    private ApplicationContext applicationContext;

    private Channel serverChannel;

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void run(ApplicationArguments args) throws Exception {

        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup);
            serverBootstrap.channel(NioServerSocketChannel.class);
            serverBootstrap.localAddress(new InetSocketAddress(this.ip, this.port));
            serverBootstrap.childHandler(new ChannelInitializer&amp;lt;SocketChannel&amp;gt;() {
                @Override
                protected void initChannel(SocketChannel socketChannel) throws Exception {
                    ChannelPipeline pipeline = socketChannel.pipeline();
                    pipeline.addLast(new HttpServerCodec());
                    pipeline.addLast(new ChunkedWriteHandler());
                    pipeline.addLast(new HttpObjectAggregator(65536));
                    pipeline.addLast(new ChannelInboundHandlerAdapter() {
                        @Override
                        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                            if(msg instanceof FullHttpRequest) {
                                FullHttpRequest fullHttpRequest = (FullHttpRequest) msg;
                                String uri = fullHttpRequest.uri();
                                if (!uri.equals(path)) {
                                    // 访问的路径不是 websocket的端点地址，响应404
                                    ctx.channel().writeAndFlush(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.NOT_FOUND))
                                        .addListener(ChannelFutureListener.CLOSE);
                                    return ;
                                }
                            }
                            super.channelRead(ctx, msg);
                        }
                    });
                    pipeline.addLast(new WebSocketServerCompressionHandler());
                    pipeline.addLast(new WebSocketServerProtocolHandler(path, null, true, maxFrameSize));

                    /**
                     * 从IOC中获取到Handler
                     */
                    pipeline.addLast(applicationContext.getBean(WebsocketMessageHandler.class));
                }
            });
            Channel channel = serverBootstrap.bind().sync().channel();  
            this.serverChannel = channel;
            LOGGER.info(&quot;websocket 服务启动，ip={},port={}&quot;, this.ip, this.port);
            channel.closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }

    public void onApplicationEvent(ContextClosedEvent event) {
        if (this.serverChannel != null) {
            this.serverChannel.close();
        }
        LOGGER.info(&quot;websocket 服务停止&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;NettyBootsrapRunner&lt;/code&gt; 实现了 ApplicationRunner, &lt;code&gt;ApplicationListener&amp;lt;ContextClosedEvent&amp;gt;&lt;/code&gt;, &lt;code&gt;ApplicationContextAware&lt;/code&gt; 接口。&lt;/p&gt;
&lt;p&gt;这样一来，&lt;code&gt;NettyBootsrapRunner&lt;/code&gt; 可以在App的启动和关闭时执行Websocket服务的启动和关闭。而且通过 &lt;code&gt;ApplicationContextAware&lt;/code&gt; 还能获取到 &lt;code&gt;ApplicationContext&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;通过 IOC 管理 Netty 的 Handler&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketCloseStatus;
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
import io.springboot.netty.service.DiscardService;
/**
 * 
 * @author Administrator
 *
 */
@Sharable
@Component
public class WebsocketMessageHandler extends SimpleChannelInboundHandler&amp;lt;WebSocketFrame&amp;gt; {

    private static final Logger LOGGER = LoggerFactory.getLogger(WebsocketMessageHandler.class);

    @Autowired
    DiscardService discardService;

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame msg) throws Exception {
        if (msg instanceof TextWebSocketFrame) {
            TextWebSocketFrame textWebSocketFrame = (TextWebSocketFrame) msg;
            // 业务层处理数据
            this.discardService.discard(textWebSocketFrame.text());
            // 响应客户端
            ctx.channel().writeAndFlush(new TextWebSocketFrame(&quot;我收到了你的消息：&quot; + System.currentTimeMillis()));
        } else {
            // 不接受文本以外的数据帧类型
            ctx.channel().writeAndFlush(WebSocketCloseStatus.INVALID_MESSAGE_TYPE).addListener(ChannelFutureListener.CLOSE);
        }
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        super.channelInactive(ctx);
        LOGGER.info(&quot;链接断开：{}&quot;, ctx.channel().remoteAddress());
    }
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        LOGGER.info(&quot;链接创建：{}&quot;, ctx.channel().remoteAddress());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;handler 已经是一个 IOC 管理的 Bean，可以自由的使用依赖注入等 Spring 带来的快捷功能。由于是单例存在，所有的链接都使用同一个 hander，所以尽量不要保存任何实例变量。&lt;/p&gt;
&lt;p&gt;这个 Handler 处理完毕客户端的消息后，给客户端会响应一条：&lt;code&gt;&quot;我收到了你的消息：&quot; + System.currentTimeMillis()&lt;/code&gt; 的消息&lt;/p&gt;
&lt;p&gt;为了演示在 Handler 中使用业务层，这里假装注入了一个 &lt;code&gt;DiscardService&lt;/code&gt;服务。它的逻辑很简单，就是丢弃消息：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public void discard (String message) {
    LOGGER.info(&quot;丢弃消息:{}&quot;, message);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;演示&lt;/h3&gt;
&lt;h4&gt;启动客户端&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
        &amp;lt;title&amp;gt;Websocket&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;

    &amp;lt;/body&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
        ;(function(){
            const websocket = new WebSocket(&#039;ws://localhost:1024/channel&#039;);
            websocket.onmessage = e =&amp;gt; {
                console.log(&#039;收到消息:&#039;, e.data);
            }
            websocket.onclose = e =&amp;gt; {
                let {code, reason} = e;
                console.log(`链接断开:code=${code}, reason=${reason}`);
            }
            websocket.onopen = () =&amp;gt; {
                console.log(`链接建立...`);
                websocket.send(&#039;Hello&#039;);
            }
            websocket.onerror = e =&amp;gt; {
                console.log(&#039;链接异常:&#039;, e);
            }
        })();

    &amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;链接创建后就给服务端发送一条消息：&lt;code&gt;Hello&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;关闭服务端&lt;/h4&gt;
&lt;p&gt;使用 PostMan 请求服务器的停机端点：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/c52a7ee7-3df9-49b3-8881-8dbb5cf57ef1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;日志&lt;/h3&gt;
&lt;h4&gt;客户端日志&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;index_files/12b58961-d97f-4844-8beb-d3c7f37a2c6c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;服务端日志&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;2020-06-22 17:08:22.728  INFO 9392 --- [           main] io.undertow                              : starting server: Undertow - 2.1.3.Final
2020-06-22 17:08:22.740  INFO 9392 --- [           main] org.xnio                                 : XNIO version 3.8.0.Final
2020-06-22 17:08:22.752  INFO 9392 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.8.0.Final
2020-06-22 17:08:22.839  INFO 9392 --- [           main] org.jboss.threads                        : JBoss Threads version 3.1.0.Final
2020-06-22 17:08:22.913  INFO 9392 --- [           main] o.s.b.w.e.undertow.UndertowWebServer     : Undertow started on port(s) 80 (http)
2020-06-22 17:08:22.931  INFO 9392 --- [           main] io.springboot.netty.NettyApplication     : Started NettyApplication in 4.536 seconds (JVM running for 5.175)
2020-06-22 17:08:23.653  INFO 9392 --- [           main] i.s.n.w.runner.NettyBootsrapRunner       : websocket 服务启动，ip=0.0.0.0,port=1024
2020-06-22 17:08:28.484  INFO 9392 --- [  XNIO-1 task-1] io.undertow.servlet                      : Initializing Spring DispatcherServlet &#039;dispatcherServlet&#039;
2020-06-22 17:08:28.484  INFO 9392 --- [  XNIO-1 task-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet &#039;dispatcherServlet&#039;
2020-06-22 17:08:28.492  INFO 9392 --- [  XNIO-1 task-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 8 ms
2020-06-22 17:08:28.724  INFO 9392 --- [ntLoopGroup-3-1] i.s.n.w.handler.WebsocketMessageHandler  : 链接创建：/0:0:0:0:0:0:0:1:12093
2020-06-22 17:08:28.790  INFO 9392 --- [ntLoopGroup-3-1] i.s.netty.service.DiscardService         : 丢弃消息:Hello
2020-06-22 17:08:33.688  INFO 9392 --- [     Thread-232] i.s.n.w.runner.NettyBootsrapRunner       : websocket 服务停止
2020-06-22 17:08:33.691  INFO 9392 --- [ntLoopGroup-3-1] i.s.n.w.handler.WebsocketMessageHandler  : 链接断开：/0:0:0:0:0:0:0:1:12093
2020-06-22 17:08:33.699  INFO 9392 --- [     Thread-232] io.undertow                              : stopping server: Undertow - 2.1.3.Final
2020-06-22 17:08:33.704  INFO 9392 --- [     Thread-232] io.undertow.servlet                      : Destroying Spring FrameworkServlet &#039;dispatcherServlet&#039;
2020-06-22 17:08:33.708  INFO 9392 --- [     Thread-232] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService &#039;applicationTaskExecutor&#039;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Netty会在SpringBoot App启动后启动，App停止后关闭，可以正常的对外提供服务 并且Handler交给IOC管理可以注入Service，完成业务处理。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://juejin.cn/post/6844904197129764871&quot;&gt;在SpringBoot中整合使用Netty框架 - 掘金&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%9C%A8SpringBoot%E4%B8%AD%E6%95%B4%E5%90%88%E4%BD%BF%E7%94%A8Netty%E6%A1%86%E6%9E%B6.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%9C%A8SpringBoot%E4%B8%AD%E6%95%B4%E5%90%88%E4%BD%BF%E7%94%A8Netty%E6%A1%86%E6%9E%B6.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>在 Ubuntu 22.04 上编译 RTKLIB 的 `str2str` 模块和 Ntrip Caster</title>
            <description>
            &lt;!--
author: admin
date: 2023-09-26
title: 在 Ubuntu 22.04 上编译 RTKLIB 的 `str2str` 模块和 Ntrip Caster
tags: RTK,RTCM,Ntrip
category: Linux
status: publish
summary: 自建RTK基站第一步
--&gt;
&lt;h1&gt;在 Ubuntu 22.04 上编译 RTKLIB 的 &lt;code&gt;str2str&lt;/code&gt; 模块和 Ntrip Caster&lt;/h1&gt;
&lt;h3&gt;安装编译依赖&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get update
sudo apt-get install build-essential git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果遇到以下提示：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;libc6-dev : 依赖: libc6 (= 2.35-0ubuntu3) 但是 2.35-0ubuntu3.1 正要被安装&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;则安装指定版本：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get install libc6=2.35-0ubuntu3&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;编译&lt;code&gt;str2str&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/tomojitakasu/RTKLIB.git
cd RTKLIB/app/str2str/gcc
make&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译完成后在当前目录下就能找到可执行文件&lt;code&gt;str2str&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;编译 Ntrip Caster&lt;/h3&gt;
&lt;p&gt;本文使用 ntrip caster-2.0.21 版本&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd ntripcaster-2.0.21
chmod +x configure
./configure
make
sudo make install&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置 ntrip caster&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 进入配置目录
cd /usr/local/ntripcaster/conf
# 找出所有以 .dist 结尾的文件
# 全部将它们在复制一份并去掉 .dist 结尾，例如下面的配置文件
sudo cp ntripcaster.conf.dist ntripcaster.conf
# 编辑配置文件
# server name 后面替换为自定义 ip 地址，并屏蔽掉 80 端口
# 默认端口是 2101，默认推流密码 encoder_password 是 letmein
sudo vim  ntripcaster.conf
# 修改其它文件
user.aut # 用户密码
groups.aut # 用户组：1. 指定所有组员可提取最大数据流 2. 从某个 ip 地址获取的最大数据流
clientmounts.aut # 用户组对特定挂载点的访问权限
sourcetable.dat # 动态资源表，定义向客户端发送的数据流&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /usr/local/ntripcaster/bin
sudo ./ntripcaster start| restart | stop&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://igs.bkg.bund.de/root_ftp/NTRIP/documentation/ntripcaster_manual.html&quot;&gt;BKG Professional NtripCaster Manual&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://software.rtcm-ntrip.org/wiki/STR&quot;&gt;http://software.rtcm-ntrip.org/wiki/STR&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pypi.org/project/pyrtcm/&quot;&gt;pyrtcm&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%9C%A8Ubuntu2204%E4%B8%8A%E7%BC%96%E8%AF%91RTKLIB%E7%9A%84str2str%E6%A8%A1%E5%9D%97%E5%92%8CNtripCaster.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%9C%A8Ubuntu2204%E4%B8%8A%E7%BC%96%E8%AF%91RTKLIB%E7%9A%84str2str%E6%A8%A1%E5%9D%97%E5%92%8CNtripCaster.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>SpringMVC和jQuery交互</title>
            <description>
            &lt;!--
author: admin
date: 2023-09-16
title: SpringMVC和jQuery交互
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;SpringMVC和jQuery交互&lt;/h1&gt;
&lt;h3&gt;ResponseBody 注解&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;@ResponseBody&lt;/code&gt; annotation in Spring MVC is quite important when you&#039;re building RESTful web services or APIs. This annotation essentially tells Spring that the return value of a method should be serialized and written directly to the HTTP response body, rather than being used to identify a template (like a JSP page, for example).&lt;/p&gt;
&lt;p&gt;In simpler terms, when you annotate a method with &lt;code&gt;@ResponseBody&lt;/code&gt;, the return value of that method will directly become the content of the response that the client (such as a web browser or another API) receives.&lt;/p&gt;
&lt;h4&gt;Basic Example:&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Controller
public class MyController {

    @GetMapping(&quot;/hello&quot;)
    @ResponseBody
    public String sayHello() {
        return &quot;Hello, World!&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this example, if you navigate to &lt;code&gt;http://localhost:8080/hello&lt;/code&gt;, the server will respond with a body containing just the text &amp;quot;Hello, World!&amp;quot;.&lt;/p&gt;
&lt;h4&gt;Things to Note:&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Serialization&lt;/strong&gt;: Spring will automatically serialize return objects to the appropriate format, most commonly JSON, but it could also be XML or other types, depending on your configuration and libraries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP Message Converters&lt;/strong&gt;: Spring uses HTTP Message Converters to convert the return value to HTTP response body. If your project includes Jackson library, Spring will use it to convert Java objects to JSON and vice versa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combining Annotations&lt;/strong&gt;: You&#039;ll often see &lt;code&gt;@ResponseBody&lt;/code&gt; used in combination with &lt;code&gt;@RequestMapping&lt;/code&gt;, but if you use &lt;code&gt;@RestController&lt;/code&gt; at the class level, you don&#039;t need to specify &lt;code&gt;@ResponseBody&lt;/code&gt; for each method because &lt;code&gt;@RestController&lt;/code&gt; is a shorthand that combines &lt;code&gt;@Controller&lt;/code&gt; and &lt;code&gt;@ResponseBody&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Advanced Use-case with an Object:&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@GetMapping(&quot;/user&quot;)
@ResponseBody
public User getUser() {
    User user = new User();
    user.setName(&quot;John&quot;);
    user.setAge(30);
    return user;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case, assuming you have a &lt;code&gt;User&lt;/code&gt; class with name and age fields, Spring would automatically convert the &lt;code&gt;User&lt;/code&gt; object to a JSON representation like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &quot;name&quot;: &quot;John&quot;,
    &quot;age&quot;: 30
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;jQuery 和 &lt;code&gt;$.ajax()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;If you&#039;re using jQuery&#039;s &lt;code&gt;$.ajax()&lt;/code&gt; method to interact with a Spring MVC backend, you can easily fetch or send &lt;code&gt;User&lt;/code&gt; objects. The Spring MVC backend would typically serialize these objects to JSON, and on the client side, you can deal with these JSON representations using JavaScript.&lt;/p&gt;
&lt;h4&gt;Getting Data from Server&lt;/h4&gt;
&lt;p&gt;Here&#039;s a simple example to fetch the user information from a Spring MVC endpoint using jQuery&#039;s &lt;code&gt;$.ajax()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;$.ajax({
  url: &#039;http://localhost:8080/user&#039;,
  type: &#039;GET&#039;,
  dataType: &#039;json&#039;,
  success: function(data) {
    console.log(&#039;User name is: &#039; + data.name);
    console.log(&#039;User age is: &#039; + data.age);
  },
  error: function(err) {
    console.log(&#039;Error: &#039;, err);
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this example, &lt;code&gt;data&lt;/code&gt; in the &lt;code&gt;success&lt;/code&gt; callback function would be the JSON object that represents the &lt;code&gt;User&lt;/code&gt;. Here you can see we are directly accessing the properties of &lt;code&gt;User&lt;/code&gt; as &lt;code&gt;data.name&lt;/code&gt; and &lt;code&gt;data.age&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Sending Data to Server&lt;/h4&gt;
&lt;p&gt;If you&#039;d like to send data to the server, you can also use &lt;code&gt;$.ajax()&lt;/code&gt; but with different options:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var user = {
  name: &#039;John&#039;,
  age: 30
};

$.ajax({
  url: &#039;http://localhost:8080/user&#039;,
  type: &#039;POST&#039;,
  dataType: &#039;json&#039;,
  contentType: &#039;application/json&#039;,
  data: JSON.stringify(user),
  success: function(data) {
    console.log(&#039;Data sent successfully.&#039;);
  },
  error: function(err) {
    console.log(&#039;Error: &#039;, err);
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this example, we create a &lt;code&gt;user&lt;/code&gt; object and use &lt;code&gt;JSON.stringify()&lt;/code&gt; to convert it to a JSON string. We then specify that we&#039;re sending JSON data by setting the &lt;code&gt;contentType&lt;/code&gt; option to &lt;code&gt;&#039;application/json&#039;&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Server-Side Code for Handling &lt;code&gt;POST&lt;/code&gt; Request&lt;/h4&gt;
&lt;p&gt;On the server side, you&#039;ll have a corresponding Spring MVC method to handle the incoming JSON data, something like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@PostMapping(&quot;/user&quot;)
public void addUser(@RequestBody User user) {
  // Handle the user object here
  System.out.println(&quot;Name: &quot; + user.getName());
  System.out.println(&quot;Age: &quot; + user.getAge());
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note the use of the &lt;code&gt;@RequestBody&lt;/code&gt; annotation, which tells Spring to deserialize the incoming JSON data into a &lt;code&gt;User&lt;/code&gt; object.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Create by ChatGPT-4&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringMVC%E5%92%8CjQuery%E4%BA%A4%E4%BA%92.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringMVC%E5%92%8CjQuery%E4%BA%A4%E4%BA%92.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>使用 Python 生成可调节参数的函数图像</title>
            <description>
            &lt;!--
author: admin
date: 2023-09-13
title: 使用 Python 生成可调节参数的函数图像
tags: jupyter
category: Python
status: publish
summary: Python 画图使用说明
--&gt;
&lt;h1&gt;使用 Python 生成可调节参数的函数图像&lt;/h1&gt;
&lt;p&gt;Can you plot the graph where I can adjust $k$? I want to know the influence of different K&#039;s on graphs.&lt;/p&gt;
&lt;p&gt;the function:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/b1b66c41-22ce-458d-9c9a-b9b0f37b6f27.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;is an exponential decay function centered at $x=10000$ . The parameter $k$ affects the rate of decay: the higher the value of $k$, the faster the function approaches zero as $x$ increases beyond 10000.&lt;/p&gt;
&lt;p&gt;To help you visualize the influence of different $k$ values, I&#039;ll plot an interactive graph where you can adjust $k$ and see how the curve changes.&lt;/p&gt;
&lt;p&gt;To run this code, you&#039;ll need to install &lt;code&gt;matplotlib&lt;/code&gt; and &lt;code&gt;ipywidgets&lt;/code&gt; if you haven&#039;t already. You can install these packages using pip:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;pip install matplotlib ipywidgets numpy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run jupyter notebook&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;jupyter notebook&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Input:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import matplotlib.pyplot as plt
import numpy as np
import ipywidgets as widgets
%matplotlib inline&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def plot_exp_decay(k):
    x = np.linspace(9500, 10500, 500)
    y = np.exp(-k * (x - 10000))

    plt.figure(figsize=(10, 6))
    plt.plot(x, y, label=f&#039;$e^{{-{k} \cdot (x - 10000)}}$&#039;)
    plt.title(&quot;Exponential Decay Function&quot;)
    plt.xlabel(&quot;x&quot;)
    plt.ylabel(&quot;y&quot;)
    plt.legend()
    plt.grid(True)
    plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;k_slider = widgets.FloatSlider(value=0.001, min=0.001, max=0.1, step=0.001, description=&#039;K:&#039;)
widgets.interactive(plot_exp_decay, k=k_slider)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/0840656f-d78d-4ea5-9725-c6bedd3d0b8d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Create by ChatGPT-4 with Advanced Data Analysis&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Adjusting_Exponential_Decay_Graph.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Adjusting_Exponential_Decay_Graph.html</guid>
                                               <category>Python</category>
                                    </item>
                <item>
            <title>A Journey into Crafting a Balanced Decaying Sigmoid Function</title>
            <description>
            &lt;!--
author: admin
date: 2023-09-12
title: A Journey into Crafting a Balanced Decaying Sigmoid Function
tags: Sigmoid函数
category: 数学
status: publish
summary: 学好数理化
--&gt;
&lt;h1&gt;A Journey into Crafting a Balanced Decaying Sigmoid Function&lt;/h1&gt;
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;The Sigmoid function is a widely used mathematical function in machine learning, especially in neural networks, for the purpose of introducing non-linearity into the model. However, there are scenarios where a decaying Sigmoid function, a flipped version of the standard Sigmoid, might be required. Furthermore, we may need to tune this function to fit specific ranges for the input and output.&lt;/p&gt;
&lt;p&gt;In this blog, we will explore how to create a balanced Decaying Sigmoid function that meets specific criteria. Specifically, the function should have a smooth curve that decays within a specified range for $x$ and $y$ .&lt;/p&gt;
&lt;h3&gt;The Standard Sigmoid Function&lt;/h3&gt;
&lt;p&gt;The standard Sigmoid function is defined as:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e4fbbf23-34e7-479b-b31f-c3c1b37332da.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It maps any given input $x$ into a value between 0 and 1 . &lt;/p&gt;
&lt;h3&gt;The Decaying Sigmoid Function&lt;/h3&gt;
&lt;p&gt;The Decaying Sigmoid function is essentially &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/d04362a3-9522-413e-98b6-32c0a9da9922.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;and it maps $x$ to values between 0 and 1, but in a decaying manner. The mathematical representation is:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/4787f826-89a0-4a9a-8662-55d225cd507f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Customizing the Decaying Sigmoid Function&lt;/h3&gt;
&lt;p&gt;Our challenge is to modify this function to operate within specific bounds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$x$ should be in the range $[10000, 100000]$&lt;/li&gt;
&lt;li&gt;$y$ should be in the open range $(0.01, 0.49)$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The general form of the modified Decaying Sigmoid function can be given as:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/8f5b2d50-7c5c-4f55-9e51-5b358876c2ea.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;where $a,b,c,d$ are parameters that control the shape, position, and bounds of the curve.&lt;/p&gt;
&lt;h4&gt;Understanding the Parameters&lt;/h4&gt;
&lt;p&gt;In our customized Decaying Sigmoid function, the parameters $a,b,c,d$ play crucial roles in shaping the curve and placing it within the desired bounds. Here&#039;s what each parameter does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$a$ This is the steepness parameter. It controls how quickly the curve rises or falls. A higher value of $a$ will make the curve steeper, while a lower value will make it more gradual.&lt;/li&gt;
&lt;li&gt;$b$ This is the horizontal shift parameter. It moves the curve along the $x$ -axis. By adjusting $b$ , you can control where the curve starts to decay.&lt;/li&gt;
&lt;li&gt;$c$ This is the upper bound for $y$ . It specifies the maximum value that $y$ can take, which, in our case, is set to 0.49.&lt;/li&gt;
&lt;li&gt;$d$ This is the lower bound for $y$ . It specifies the minimum value that $y$ can take. For our function, $d$ is set to 0.01.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After some experimentation and fine-tuning, we arrived at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$a = 5 \times 10^{-5}$&lt;/li&gt;
&lt;li&gt;$b=10000$&lt;/li&gt;
&lt;li&gt;$c = 0.49$&lt;/li&gt;
&lt;li&gt;$d = 0.01$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thus, our final function becomes:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e3baa80f-98a0-4b54-95e2-97dff44db22c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Crafting a customized Decaying Sigmoid function requires an understanding of how its parameters influence its shape and boundaries. We successfully managed to create a function that is neither too steep nor too flat and operates within the specified ranges for $x$ and $y$. This exercise demonstrates the flexibility and utility of mathematical functions in meeting specific application requirements.&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/A_Journey_into_Crafting_a_Balanced_Decaying_Sigmoid_Function.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/A_Journey_into_Crafting_a_Balanced_Decaying_Sigmoid_Function.html</guid>
                                               <category>数学</category>
                                    </item>
                <item>
            <title>如何确定神经网络的层数和隐藏层神经元数量</title>
            <description>
            &lt;!--
author: admin
date: 2023-09-11
title: 如何确定神经网络的层数和隐藏层神经元数量
tags: 神经网络
category: 深度学习
status: publish
summary: 炼丹？
--&gt;
&lt;h1&gt;如何确定神经网络的层数和隐藏层神经元数量&lt;/h1&gt;
&lt;h3&gt;导语&lt;/h3&gt;
&lt;p&gt;BP神经网络主要由&lt;strong&gt;输入层&lt;/strong&gt;、&lt;strong&gt;隐藏层&lt;/strong&gt;、&lt;strong&gt;输出层&lt;/strong&gt;构成，输入和输出层的节点数是固定的，不论是回归还是分类任务，选择合适的层数以及隐藏层节点数，在很大程度上都会影响神经网络的性能。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/1a2ed3b6-c788-4bf5-b61c-caaf9358cff6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;输入层和输出层的节点数量很容易得到&lt;/strong&gt;。输入层的神经元数量等于待处理数据中输入变量的数量，输出层的神经元的数量等于与每个输入关联的输出的数量。但是真正的困难之处在于&lt;strong&gt;确定合适的隐藏层及其神经元的数量&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;隐藏层的层数&lt;/h3&gt;
&lt;p&gt;如何确定隐藏层的层数是一个至关重要的问题。首先需要注意一点：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在神经网络中，当且仅当数据非线性分离时才需要隐藏层！&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Since a single sufficiently large hidden layer is adequate for approximation of most functions, why would anyone ever use more? One reason hangs on the words “sufficiently large”. Although a single hidden layer is optimal for some functions, there are others for which a single-hidden-layer-solution is very inefficient compared to solutions with more layers.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;—— &lt;a href=&quot;https://www.amazon.com/Neural-Smithing-Supervised-Feedforward-Artificial/dp/0262527014&quot;&gt;Neural Smithing: Supervised Learning in Feedforward Artificial Neural Networks (Bradford Book)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;因此，对于一般&lt;strong&gt;简单&lt;/strong&gt;的数据集，&lt;strong&gt;一两层隐藏层通常就足够了&lt;/strong&gt;。但对于涉及时间序列或计算机视觉的复杂数据集，则需要额外增加层数。单层神经网络只能用于表示线性分离函数，也就是非常简单的问题，比如分类问题中的两个类可以用一条直线整齐地分开。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Specifically, the universal approximation theorem states that a feedforward network with a linear output layer and at least one hidden layer with any “squashing” activation function (such as the logistic sigmoid activation function) can approximate any Borel measurable function from one finite-dimensional space to another with any desired non-zero amount of error, provided that the network is given enough hidden units.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;—— &lt;a href=&quot;https://www.amazon.com/Deep-Learning-Adaptive-Computation-Machine/dp/0262035618/&quot;&gt;Deep Learning (Adaptive Computation and Machine Learning series)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;概括来说就是多个隐藏层可以用于拟合非线性函数。&lt;/p&gt;
&lt;p&gt;隐藏层的层数与神经网络的效果/用途，可以用如下表格概括：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/67243a1c-ad29-41b5-81cb-644229e69e4d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;简要概括一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;没有隐藏层&lt;/strong&gt;：仅能够表示线性可分函数或决策&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐藏层数=1&lt;/strong&gt;：可以拟合任何“包含从一个有限空间到另一个有限空间的连续映射”的函数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐藏层数=2&lt;/strong&gt;：搭配适当的激活函数可以表示任意精度的任意决策边界，并且可以拟合任何精度的任何平滑映射&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐藏层数&amp;gt;2&lt;/strong&gt;：多出来的隐藏层可以学习复杂的描述（某种自动特征工程）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Empirically, greater depth does seem to result in better generalization for a wide variety of tasks. This suggests that using deep architectures does indeed express a useful prior over the space of functions the model learns.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;—— &lt;a href=&quot;https://www.amazon.com/Deep-Learning-Adaptive-Computation-Machine/dp/0262035618/&quot;&gt;Deep Learning (Adaptive Computation and Machine Learning series)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;层数越深，理论上拟合函数的能力增强，效果按理说会更好，但是实际上更深的层数可能会带来过拟合的问题，同时也会增加训练难度，使模型难以收敛。因此我的经验是，在使用BP神经网络时，最好可以参照已有的表现优异的模型，如果实在没有，则根据上面的表格，从一两层开始尝试，尽量不要使用太多的层数。在 CV、NLP 等特殊领域，可以使用 CNN、RNN、attention 等特殊模型，不能不考虑实际而直接无脑堆砌多层神经网络。&lt;strong&gt;尝试迁移和微调已有的预训练模型，能取得事半功倍的效果&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/3e27a70c-3d9d-4193-b02c-d6d99cf46d71.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确定隐藏的神经元层的数量只是问题的一小部分。还需要确定这些隐藏层中的每一层包含多少个神经元。下面将介绍这个过程。&lt;/p&gt;
&lt;h3&gt;隐藏层中的神经元数量&lt;/h3&gt;
&lt;p&gt;在隐藏层中使用太少的神经元将导致&lt;strong&gt;欠拟合(underfitting)&lt;/strong&gt;。相反，使用过多的神经元同样会导致一些问题。首先，隐藏层中的神经元过多可能会导致&lt;strong&gt;过拟合(overfitting)&lt;/strong&gt;。当神经网络具有过多的节点（过多的信息处理能力）时，训练集中包含的有限信息量不足以训练隐藏层中的所有神经元，因此就会导致过拟合。即使训练数据包含的信息量足够，隐藏层中过多的神经元会增加训练时间，从而难以达到预期的效果。显然，选择一个合适的隐藏层神经元数量是至关重要的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/af53f7b0-5309-446a-9503-cc29b0a1c3f3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;通常，&lt;strong&gt;对所有隐藏层使用相同数量的神经元就足够了&lt;/strong&gt;。对于某些数据集，拥有较大的第一层并在其后跟随较小的层将导致更好的性能，因为第一层可以学习很多低阶的特征，这些较低层的特征可以馈入后续层中，提取出较高阶特征。&lt;/p&gt;
&lt;p&gt;需要注意的是，与在每一层中添加更多的神经元相比，&lt;strong&gt;添加层层数将获得更大的性能提升&lt;/strong&gt;。因此，&lt;strong&gt;不要在一个隐藏层中加入过多的神经元&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对于如何确定神经元数量，有很多经验之谈。&lt;/p&gt;
&lt;p&gt;Stackoverflow上有大神给出了经验公式以供参考：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/46ab0a2f-1ec3-42b7-976d-6871725f0ecb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;还有另一种方法可供参考，神经元数量通常可以由一下几个原则大致确定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;隐藏神经元的数量应在输入层的大小和输出层的大小之间。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐藏神经元的数量应为输入层大小的2/3加上输出层大小的2/3。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐藏神经元的数量应小于输入层大小的两倍。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总而言之，隐藏层神经元是最佳数量需要&lt;strong&gt;自己通过不断试验获得&lt;/strong&gt;，建议从一个较小数值比如1到5层和1到100个神经元开始，如果欠拟合然后慢慢添加更多的层和神经元，如果过拟合就减小层数和神经元。此外，在实际过程中还可以考虑引入&lt;strong&gt;Batch Normalization, Dropout, 正则化&lt;/strong&gt;等降低过拟合的方法。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/100419971&quot;&gt;# 如何确定神经网络的层数和隐藏层神经元数量&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E7%9A%84%E5%B1%82%E6%95%B0%E5%92%8C%E9%9A%90%E8%97%8F%E5%B1%82%E7%A5%9E%E7%BB%8F%E5%85%83%E6%95%B0%E9%87%8F.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E7%9A%84%E5%B1%82%E6%95%B0%E5%92%8C%E9%9A%90%E8%97%8F%E5%B1%82%E7%A5%9E%E7%BB%8F%E5%85%83%E6%95%B0%E9%87%8F.html</guid>
                                               <category>深度学习</category>
                                    </item>
                <item>
            <title>Geometry of Image Formation</title>
            <description>
            &lt;!--
author: admin
date: 2023-07-15
title: Geometry of Image Formation
tags: 矩阵,相机成像
category: 数学
status: publish
summary: 学好数理化
--&gt;
&lt;h1&gt;Geometry of Image Formation&lt;/h1&gt;
&lt;p&gt;In this post, we will explain the image formation from a geometrical point of view.&lt;/p&gt;
&lt;p&gt;在本篇文章中，我们将从几何角度解释图像的形成。&lt;/p&gt;
&lt;p&gt;Specifically, we will cover the math behind how a point in 3D gets projected on the image plane.&lt;/p&gt;
&lt;p&gt;具体来说，我们将介绍 3D 中的点如何投射到图像平面上的数学原理。&lt;/p&gt;
&lt;p&gt;This post is written with beginners in mind but it is mathematical in
nature. That said, all you need to know is matrix multiplication.&lt;/p&gt;
&lt;p&gt;这篇文章是为初学者编写的，但它是数学性质的，也就是说，您只需要知道矩阵乘法。&lt;/p&gt;
&lt;p&gt;To understand the problem easily, let’s say you have a camera deployed in a room.&lt;/p&gt;
&lt;p&gt;为了便于理解这个问题，假设您在一个房间里安装了一台摄像机。&lt;/p&gt;
&lt;p&gt;Given a 3D point &lt;strong&gt;P&lt;/strong&gt; in this room, we want to find the pixel coordinates (u, v) of this 3D point in the image taken by the camera.&lt;/p&gt;
&lt;p&gt;给定房间中的三维点P，我们希望在摄像机拍摄的图像中找到该三维点的像素坐标&lt;code&gt;(u, v)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;There are three coordinate systems in play in this setup. Let’s go over them.&lt;/p&gt;
&lt;p&gt;在此情景中有三个坐标系。让我们来看看。&lt;/p&gt;
&lt;h3&gt;World Coordinate System 世界坐标系&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;index_files/587d3d9e-01df-4ca8-ba87-22b4cf50cb51.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图1. 世界坐标系和相机坐标系通过旋转和平移来关联。这六个参数中，3个用于旋转，3个用于平移，称为相机的外部参数。&lt;/p&gt;
&lt;p&gt;To define locations of points in the room we need to first define a coordinate system for this room. It requires two things:&lt;/p&gt;
&lt;p&gt;为了定义房间内各点的位置，我们首先需要为该房间定义一个坐标系。这需要两个条件:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Origin&lt;/strong&gt; : We can arbitrarily fix a corner of the room as the origin $(0,0,0)$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;X, Y, Z axes&lt;/strong&gt; : We can also define the X and Y axis of the room along the two dimensions on the floor and the Z axis along the vertical wall.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Using the above, we can find the 3D coordinates of any point in this room by measuring its distance from the origin along the X, Y, and Z axes.&lt;/p&gt;
&lt;p&gt;利用上述方法，我们可以沿着X、Y和Z轴测量房间内任意一点与原点的距离，从而求得该点的三维坐标。&lt;/p&gt;
&lt;p&gt;This coordinate system attached to the room is referred to as the &lt;strong&gt;World Coordinate System&lt;/strong&gt;. In Figure 1, it is shown using orange colored axes.We will use bold font (e.g. $\mathbf{X}_w$) to show the axis, and regular font to show a coordinate of the point (e.g. $X_w$).&lt;/p&gt;
&lt;p&gt;这个附着到房间的坐标系称为世界坐标系，在图1中，用橙色坐标轴表示。我们使用粗体来表示坐标轴(例如 $\mathbf{X}_w$)，使用斜体来表示点的坐标(例如 $X_w$)。&lt;/p&gt;
&lt;p&gt;Let us consider a point &lt;strong&gt;P&lt;/strong&gt; in this room.In the world coordinate system, the coordinates of P are given by ($X_w,Y_w,Z_w$) . You can find $X_w$, $Y_w$ and $Z_w$ coordinates of this point by simply measuring the distance of this point from the origin along the three axes.&lt;/p&gt;
&lt;p&gt;让我们考虑这个房间里的 &lt;strong&gt;P&lt;/strong&gt; 点，在世界坐标系中，P 点的坐标由 ($X_w$, $Y_w$, $Z_w$) 给出。通过简单的测量该点沿三个轴到原点的距离，可以找到该点的 $X_w$, $Y_w$, $Z_w$ 坐标。&lt;/p&gt;
&lt;h3&gt;Camera Coordinate System 相机坐标系&lt;/h3&gt;
&lt;p&gt;Now, let’s put a camera in this room.&lt;/p&gt;
&lt;p&gt;现在，让我们放一个摄像机在房间里。&lt;/p&gt;
&lt;p&gt;The image of the room will be captured using this camera, and therefore,
we are interested in a 3D coordinate system attached to this camera.&lt;/p&gt;
&lt;p&gt;房间的图像将通过该摄像机捕捉，因此，我们对与该摄像机附带的三维坐标系很感兴趣。&lt;/p&gt;
&lt;p&gt;If we had put the camera at origin of the room, and align it such that its X, Y, and Z axes aligned with the $\mathbf{X}_w$, $\mathbf{Y}_w$ and $\mathbf{Z}_w$ axes of the room, the two coordinate systems would be the same.&lt;/p&gt;
&lt;p&gt;如果我们将摄像机放在房间的原点，并将其对齐，使其的 X 轴，Y 轴和 Z 轴与房间的$\mathbf{X}_w$, $\mathbf{Y}_w$ 和 $\mathbf{Z}_w$ 轴对齐，则两个坐标系将是相同的。&lt;/p&gt;
&lt;p&gt;However, that is an absurd restriction. We would want to put the camera
anywhere in the room and it should be able to look anywhere. In such a
case, we need to find the relationship between the 3D room (i.e. world)
coordinates and the 3D camera coordinates.&lt;/p&gt;
&lt;p&gt;然而，这是一个荒谬的限制。我们希望将摄像机放置在房间的任何地方，而且它应该能够观察到任何地方。在这种情况下，我们需要找到三维房间（即世界）坐标与三维摄像机坐标之间的关系。&lt;/p&gt;
&lt;p&gt;Let’s say our camera is located at some arbitrary location ($t_X$, $t_Y$, $t_Z$) in the room. In technical jargon, we can the camera coordinate is &lt;strong&gt;translated&lt;/strong&gt; by ($t_X$, $t_Y$, $t_Z$) with respect to the world coordinates.&lt;/p&gt;
&lt;p&gt;假设我们的摄像机位于房间的任意位置 ($t_X$, $t_Y$, $t_Z$) 。用术语来说，我们可以将相机坐标相对于世界坐标平移 ($t_X$, $t_Y$, $t_Z$)。&lt;/p&gt;
&lt;p&gt;The camera may be also looking in some arbitrary direction. In other words, we can say the camera is &lt;strong&gt;rotated&lt;/strong&gt; with respect to the world coordinate system.&lt;/p&gt;
&lt;p&gt;摄像机也可以朝任意方向拍摄。换句话说，我们可以说摄像机相对于世界坐标系进行了旋转。&lt;/p&gt;
&lt;p&gt;Rotation in 3D is captured using three parameters —- you can think of
the three parameters as yaw, pitch, and roll. You can also think of it
as an axis in 3D ( two parameters ) and an angular rotation about that
axis (one parameter).&lt;/p&gt;
&lt;p&gt;三维旋转通过三个参数来捕捉--您可以将这三个参数理解为偏航、俯仰和滚动。您也可以将其视为 3D 中的一个轴（两个参数）和围绕该轴的角度旋转（一个参数）。&lt;/p&gt;
&lt;p&gt;However, it is often convenient for mathematical manipulation to encode
rotation as a 3×3 matrix. Now, you may be thinking that a 3×3 matrix has
9 elements and therefore 9 parameters but rotation has only 3
parameters. That’s true, and that is exactly why any arbitrary 3×3
matrix is not a rotation matrix. Without going into the details, let us
for now just know that a rotation matrix has only three degrees of
freedom even though it has 9 elements.&lt;/p&gt;
&lt;p&gt;然而，将旋转编码为 3×3 矩阵通常便于数学运算。现在，您可能会想，3×3 矩阵有 9 个元素，因此有 9 个参数，但旋转却只有 3
个参数。没错，这也正是为什么任意的 3×3 矩阵都不是旋转矩阵的原因。我们暂且不讨论细节，只想知道，旋转矩阵虽然有9个元素，但只有3个自由度。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;PS. 这里使用 ChatGPT 延伸一下。&lt;/p&gt;
&lt;p&gt;Let&#039;s consider a rotation around the z-axis by an angle of π/4 radians (or 45 degrees). The rotation matrix for this transformation is:&lt;/p&gt;
&lt;p&gt;让我们考虑绕z轴旋转π/4弧度(或45度)的角度。此变换的旋转矩阵为：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e1ae6cd3-123b-46ab-8b5e-c3d3eab8cadf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This matrix represents a rotation in 3D space. The first two rows and columns correspond to a 2D rotation matrix for an angle of π/4, while the last row and column ensure that points on the z-axis remain unchanged.&lt;/p&gt;
&lt;p&gt;该矩阵表示3D空间中的旋转。前两行和列对应于角度为π/4的2D旋转矩阵，而最后一行和列确保z轴上的点保持不变。&lt;/p&gt;
&lt;p&gt;You can see that the rows and columns of this matrix are orthogonal (their dot product is zero), and the determinant of the matrix is +1. These properties confirm that this is indeed a rotation matrix.&lt;/p&gt;
&lt;p&gt;可以看到这个矩阵的行和列是正交的(它们的点积为零)，矩阵的行列式是+1。这些性质证实了这确实是一个旋转矩阵。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Back to our original problem. The world coordinate and the camera coordinates are related by a rotation matrix $\mathbf{R}$ and a 3 element translation vector $\mathbf{t}$ .&lt;/p&gt;
&lt;p&gt;回到我们最初的问题。世界坐标和相机坐标通过旋转矩阵 $\mathbf{R}$ 和 3 个元素的平移向量 $\mathbf{t}$ 相关联。&lt;/p&gt;
&lt;p&gt;What does that mean?&lt;/p&gt;
&lt;p&gt;这是什么意思？&lt;/p&gt;
&lt;p&gt;It means that point P which had coordinate values ($X_w$, $Y_w$, $Z_w$) in the world coordinates will have different coordinate values ($X_c$, $Y_c$, $Z_c$) in the camera coordinate system. We are representing the camera coordinate system using red color.&lt;/p&gt;
&lt;p&gt;这意味着在世界坐标中具有坐标值 ($X_w$, $Y_w$, $Z_w$) 的点 P 在摄像机坐标系中将具有不同的坐标值 ($X_c$, $Y_c$, $Z_c$) 。 我们用红色表示相机坐标系。&lt;/p&gt;
&lt;p&gt;The two coordinate values are related by the following equation.&lt;/p&gt;
&lt;p&gt;两个坐标值的关系式如下(等式 1)：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/c22a0379-f576-4e2c-90a3-66aab65dd5cb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Notice that representing rotation as a matrix allowed us to do rotation with a simple matrix multiplication instead of tedious symbol manipulation required in other representations like yaw, pitch, roll. I hope this helps you appreciate why we represent rotations as a matrix. &lt;/p&gt;
&lt;p&gt;请注意，将旋转表示为矩阵使我们能够通过简单的矩阵乘法来实现旋转，而不是像偏航、俯仰、滚动等其他表示方法所要求的繁琐的符号操作。&lt;/p&gt;
&lt;p&gt;Sometimes the expression above is written in a more compact form. The
3×1 translation vector is appended as a column at the end of the 3×3
rotation matrix to obtain a 3×4 matrix called the &lt;strong&gt;Extrinsic Matrix&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;有时，上述表达式的写法更为简洁。3×1平移矢量作为一列附加在3×3旋转矩阵的末尾，得到一个3×4矩阵，称为外差矩阵(等式 2)：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/b349489c-c146-46bf-8b32-136066fcb483.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;where, the extrinsic matrix $\mathbf{P}$ is given by:&lt;/p&gt;
&lt;p&gt;其中，外部矩阵 $\mathbf{P}$ 由下式给出(等式 3)：&lt;/p&gt;
&lt;p&gt;$$
\mathbf{P} = \begin{bmatrix} \mathbf{R} | \mathbf{t} \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;Homogeneous coordinates : In projective geometry, we often work with a funny representation of coordinates where an extra dimension is appended to the coordinates. A 3D point ($X$, $Y$, $Z$) in cartesian coordinates can written as ($X$, $Y$, $Z$, $1$) in homogenous coordinates. More generally, a point in homogenous coordinate ($X$, $Y$, $Z$, $W$) is the same as the point ($X/W$, $Y/W$, $Z/W$) in cartesian coordinates. Homogenous coordinates allow us to represent infinite quantities using finite numbers. For example, the point at infinity can be represented as ($1$, $1$, $1$, $0$) in homogenous coordinates. You may notice that we have used homogenous coordinates in Equation 2 to represent the world coordinates.&lt;/p&gt;
&lt;p&gt;齐次坐标：在射影几何中，我们经常用一种有趣的坐标表示法，在坐标上附加一个额外的维度。笛卡尔坐标中的3D点 ($X$, $Y$, $Z$) 可以写成齐次坐标中的 ($X$, $Y$, $Z$, $1$) 。 更一般地，齐次坐标 ($X$, $Y$, $Z$, $W$) 中的点与笛卡尔坐标中的点 ($X/W$, $Y/W$, $Z/W$) 相同。齐次坐标允许我们用有限的数字来表示无限的量，例如，无穷远处的点可以在齐次坐标中表示为 ($1$, $1$, $1$, $0$) 。您可能会注意到，我们在等式 2 中使用了齐次坐标来表示世界坐标。&lt;/p&gt;
&lt;h3&gt;Image Coordinate System 图像坐标系&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;index_files/5aa1630c-d498-44f3-ac15-24e4d816ae3e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图 2. P点在图像平面上的投影如图所示。&lt;/p&gt;
&lt;p&gt;Once we get a point in 3D coordinate system of the camera by applying a
rotation and translation to the points world coordinates, we are in a
position to project the point on the image plane to obtain a location of
the point in the image.&lt;/p&gt;
&lt;p&gt;通过对点的世界坐标进行旋转和平移，在摄像机的三维坐标系中得到该点后，我们就可以将该点投影到图像平面上，从而得到该点在图像中的位置。&lt;/p&gt;
&lt;p&gt;In the image above, we are looking at a point P with coordinates ($X_c$, $Y_c$, $Z_c$) in the camera coordinate system. Just a reminder, if we did not know the coordinates of this point in the camera coordinate system, we could transform its world coordinates using the Extrinsic Matrix to obtain the coordinates in the camera coordinate system using Equation 2. &lt;/p&gt;
&lt;p&gt;在上图中，我们看到点 P，它在相机坐标系中的坐标为 ($X_c$, $Y_c$, $Z_c$) 。只是提醒一下，如果我们不知道这个点在相机坐标系中的坐标，我们可以使用外部矩阵转换它的世界坐标，使用等式 2 获得相机坐标系中的坐标。&lt;/p&gt;
&lt;p&gt;Figure 2, shows the camera projection in case of a simple pin hole camera.&lt;/p&gt;
&lt;p&gt;图 2 显示了简单针孔摄像机的投影情况。&lt;/p&gt;
&lt;p&gt;The optical center (pin hole) is represented using $O_c$ ，In reality an inverted image of the point is formed on the image plane. For mathematical convenience, we simply do all the calculations as if the image plane is in front of the optical center because the image read out from the sensor can be trivially rotated by 180 degrees to compensate for the inversion. In practice even this is not required. Reader Olaf Peters pointed out in the comments section — “It is even simpler: a real cameras sensor just reads out from the most bottom row
in reverse order (from right to left), and then from bottom to top for each row. By this method the image is automatically formed upright and left and right are in correct order. So in practice there is no need to rotate the image anymore.”&lt;/p&gt;
&lt;p&gt;光学中心(针孔)用 $O_c$ 表示。实际上，该点的倒像形成在像平面上。为了数学上的方便，我们简单地进行所有的计算，就好像图像平面在光学中心的前面，因为从传感器读出的图像可以轻微地旋转 180 度以补偿反转。实际上，甚至这也不是必需的。读者Olaf Peters 在评论部分指出——“这甚至更简单:一个真正的相机传感器只是以相反的顺序(从右到左)从最底部的一行读取，然后从底部到顶部读取每一行。通过这种方法，图像被自动地形成为直立的，并且左和右处于正确的顺序。所以实际上没有必要再旋转图像了。”&lt;/p&gt;
&lt;p&gt;The image plane is placed at a distance $f$ (focal length) from the optical center.&lt;/p&gt;
&lt;p&gt;图像平面与光学中心的距离为 $f$ (焦距)。&lt;/p&gt;
&lt;p&gt;Using high school geometry ( similar triangles ), we can show the project image ($x$, $y$) of the 3D point ($X_c$, $Y_c$, $Z_c$) is given by:&lt;/p&gt;
&lt;p&gt;使用高中几何(相似三角形)，我们可以通过下面的等式 4 得出 3 维点 ($X_c$, $Y_c$, $Z_c$) 在投影图像上的位置 ($x$, $y$) 。&lt;/p&gt;
&lt;p&gt;$$
x = f{X_c \over Z_c}
$$&lt;/p&gt;
&lt;p&gt;$$
y = f{Y_c \over Z_c}
$$&lt;/p&gt;
&lt;p&gt;The above two equations can be rewritten in matrix form as follows:&lt;/p&gt;
&lt;p&gt;上述两个方程可以矩阵形式重写如下(等式 5)：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/df9b3402-7397-4f81-a557-71284ffcfc02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The matrix $K$ shown below is called the &lt;strong&gt;Intrinsic Matrix&lt;/strong&gt; and contains the intrinsic parameters of the camera.&lt;/p&gt;
&lt;p&gt;下图(等式 6)所示的矩阵 $K$ 称为本征矩阵，包含相机的本征参数。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/ff535e52-9885-4654-b869-aa18bd84f88e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The above simple matrix shows only the focal length.&lt;/p&gt;
&lt;p&gt;上述简单矩阵仅显示焦距。&lt;/p&gt;
&lt;p&gt;However, the pixels in the image sensor may not be square, and so we may have two different focal lengths $f_x$ and $f_y$ .&lt;/p&gt;
&lt;p&gt;然而，图像传感器中的像素可能不是正方形的，因为我们可能有两个不同的焦距 $f_x$ 和 $f_y$ 。&lt;/p&gt;
&lt;p&gt;The optical center ($c_x$, $c_y$) of the camera may not coincide with the center of the image coordinate system.&lt;/p&gt;
&lt;p&gt;相机的光学中心 ($c_x$, $c_y$) 可能与图像坐标系的中心不重合。&lt;/p&gt;
&lt;p&gt;In addition, there may be a small skew $ \gamma$ between the x and y axes of the camera sensor.&lt;/p&gt;
&lt;p&gt;此外，相机传感器的 x 轴和 y 轴之间可能存在小小的 $\gamma$ 倾斜。&lt;/p&gt;
&lt;p&gt;Taking all the above into account, the camera matrix can be re-written as.&lt;/p&gt;
&lt;p&gt;考虑到上述所有因素，摄像机矩阵可改写为(等式 7)：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/9455c1cf-62fc-4f2f-984b-8c7f1de96695.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/4f520be2-a85e-4ffe-a7b4-6a1f316efd9a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图3. 显示了一个更真实的场景，当图像像素坐标系的原点在左上角时，固有相机矩阵需要考虑主点的位置、轴的倾斜以及沿不同轴的潜在不同焦距。&lt;/p&gt;
&lt;p&gt;However, in the above equation, the x and y pixel coordinates are with
respect to the center of the image. However, while working with images
the origin is at the top left corner of the image.&lt;/p&gt;
&lt;p&gt;然而，在上面的等式中，x和y像素坐标是相对于图像中心的。但是，在处理图像时，原点位于图像的左上角。&lt;/p&gt;
&lt;p&gt;Let’s represent the image coordinates by ($u$, $v$):&lt;/p&gt;
&lt;p&gt;让我们用以下等式 8 表示图像坐标 ($u$, $v$)：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/af8ee5b1-ab0f-43fb-a86e-0574d567ab3e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Where,&lt;/p&gt;
&lt;p&gt;$$
u = {u&#039; \over w&#039;}
$$&lt;/p&gt;
&lt;p&gt;$$
v = {v&#039; \over w&#039;}
$$&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;原文来源：&lt;a href=&quot;https://learnopencv.com/geometry-of-image-formation/&quot;&gt;https://learnopencv.com/geometry-of-image-formation/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;中文翻译来自：搜狗翻译， Deepl 翻译&lt;/p&gt;
&lt;p&gt;部分内容由 ChatGPT 生成&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/GeometryOfImageFormation.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/GeometryOfImageFormation.html</guid>
                                               <category>数学</category>
                                    </item>
                <item>
            <title>矩阵乘法 Matrix Multiplication</title>
            <description>
            &lt;!--
author: admin
date: 2023-07-14
title: 矩阵乘法 Matrix Multiplication
tags: 矩阵
category: 数学
status: publish
summary: 学好数理化
--&gt;
&lt;h1&gt;矩阵乘法Matrix Multiplication&lt;/h1&gt;
&lt;h4&gt;什么是矩阵&lt;/h4&gt;
&lt;p&gt;A Matrix is an array of numbers:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/a9ccdb38-c683-4cf5-9355-8b5b5b9391f8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在假设我们有两个矩阵 A 和 B&lt;/p&gt;
&lt;p&gt;A 有 m 行 n 列&lt;/p&gt;
&lt;p&gt;B 有 n 行 p 列&lt;/p&gt;
&lt;p&gt;要实现矩阵乘法，第一个矩阵的列数必须等于第二个矩阵的行数。所以这里 A 的 n 列和 B 的 n 行一定要相同。&lt;/p&gt;
&lt;p&gt;A 和 B 相乘得到矩阵 C，矩阵 C 有 m 行和 p 列。&lt;/p&gt;
&lt;h4&gt;矩阵相乘&lt;/h4&gt;
&lt;p&gt;两个矩阵相乘需要使用点积运算(Dot Product)。&lt;/p&gt;
&lt;p&gt;计算第1行和第1列：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/53ac7a7b-4773-4cc4-895e-3dbc20b7f091.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;            &lt;img src=&quot;index_files/fd7985d6-ee86-4c42-abc2-99c4ea5e6dff.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;用 ChatGPT 来解释一下：&lt;/p&gt;
&lt;p&gt;The dot product, also known as the scalar product, is an operation that takes two equal-length sequences of numbers (usually coordinate vectors) and returns a single number. &lt;/p&gt;
&lt;p&gt;Given two vectors ( $\mathbf{a} = [a_1, a_2, ..., a_n] $) and ( $\mathbf{b} = [b_1, b_2, ..., b_n] $), the dot product is calculated as follows:&lt;/p&gt;
&lt;p&gt;$$
\mathbf{a} \cdot \mathbf{b} = a_1b_1 + a_2b_2 + ... + a_nb_n
$$&lt;/p&gt;
&lt;p&gt;In other words, it&#039;s the sum of the products of the corresponding entries of the two sequences of numbers.&lt;/p&gt;
&lt;p&gt;For example, if we have two 3-dimensional vectors ($ \mathbf{a} = [a_1, a_2, a_3] $) and ( $\mathbf{b} = [b_1, b_2, b_3] $), their dot product would be:&lt;/p&gt;
&lt;p&gt;$$
\mathbf{a} \cdot \mathbf{b} = a_1b_1 + a_2b_2 + a_3b_3
$$&lt;/p&gt;
&lt;p&gt;The dot product is widely used in physics and engineering to calculate the angle between two vectors, the length of a vector, and the projection of one vector onto another, among other things.&lt;/p&gt;
&lt;p&gt;继续点积相乘：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/2aaab1b1-c294-4eab-8c3c-435b324ff508.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;        &lt;img src=&quot;index_files/6d440880-41f5-4e08-8b6a-d06ecf318588.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;       &lt;img src=&quot;index_files/e9e5da71-b90e-46ea-b105-1e6017b99470.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;结果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/86bce42d-98e5-4930-9a2b-976992d60f8b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后放一个三个矩阵相乘的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/d436e335-1b49-4ff8-809a-04cb788a2979.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;来自 ChatGPT 和 Wolfram&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.mathsisfun.com/algebra/matrix-multiplying.html&quot;&gt;How to Multiply Matrices&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ChatGPT with Plugins&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95MatrixMultiplication.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95MatrixMultiplication.html</guid>
                                               <category>数学</category>
                                    </item>
                <item>
            <title>造价技术标书</title>
            <description>
            &lt;!--
author: admin
date: 2023-04-16
title: 造价技术标书
tags: 造价
category: 招投标
status: publish
summary: 招投标~
--&gt;
&lt;h1&gt;（正本/副本)&lt;/h1&gt;
&lt;h1&gt;XXX&lt;/h1&gt;
&lt;h2&gt;投标文件&lt;/h2&gt;
&lt;h3&gt;（技术标书）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;项目名称：&lt;/strong&gt; [XXX]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;投标人（法人公章）：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;法定代表人（签字或签章）：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;被授权委托人（签字或签章）：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;通讯地址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;邮政编码：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;联系人：&lt;/strong&gt; 办公电话： 移动电话：&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;目 录&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#一造价咨询服务总体方案&quot;&gt;一、造价咨询服务总体方案&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第一节-项目概况&quot;&gt;第一节 项目概况&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第二节-造价咨询服务概述&quot;&gt;第二节 造价咨询服务概述&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第三节-造价咨询服务方案&quot;&gt;第三节 造价咨询服务方案&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第四节-造价咨询服务的工作内容&quot;&gt;第四节 造价咨询服务的工作内容&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#二拟投入的我司人员安排&quot;&gt;二、拟投入的我司人员安排&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#三工作流程及进度控制&quot;&gt;三、工作流程及进度控制&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第一节-造价咨询服务的工作程序&quot;&gt;第一节 造价咨询服务的工作程序&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第二节-进度控制&quot;&gt;第二节 进度控制&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#四质量控制措施&quot;&gt;四、质量控制措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第一节-质量控制制度&quot;&gt;第一节 质量控制制度&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第二节-落实制度&quot;&gt;第二节 落实制度&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第三节-人员保障&quot;&gt;第三节 人员保障&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第四节-充分准备&quot;&gt;第四节 充分准备&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第五节-控制前移&quot;&gt;第五节 控制前移&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第六节-多层把关&quot;&gt;第六节 多层把关&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第七节-项目设计阶段造价控制咨询服务的管理措施&quot;&gt;第七节 项目设计阶段造价控制咨询服务的管理措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#第八节-项目实施阶段造价控制咨询服务的保证措施&quot;&gt;第八节 项目实施阶段造价控制咨询服务的保证措施&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;一、造价咨询服务总体方案&lt;/h2&gt;
&lt;h3&gt;第一节 项目概况&lt;/h3&gt;
&lt;p&gt;本项目系XXX内部招标项目（造价咨询费在公开招标限额标准以下的项目）的造价咨询服务。&lt;/p&gt;
&lt;p&gt;造价咨询服务招标范围：具体造价咨询项目，按造价咨询服务合同约定完成造价咨询服务合同范围内的全部内容&lt;/p&gt;
&lt;p&gt;服务期限：入库通知书签发之日起2年内为XXX中的造价咨询服务单位；两年期满后，经招标人批准同意后可以延长两年时效。&lt;/p&gt;
&lt;h3&gt;第二节 造价咨询服务概述&lt;/h3&gt;
&lt;p&gt;工程建设投资及造价控制是一项系统工程，也是一项系统服务。所以，在制定造价咨询业务标准时，应强调以人为本，相应地，咨询工作内容应突出与项目管理人员的沟通，对其进行系统培训，为项目管理方设计工作流程、职责矩阵表，建立保证管理人员责任可追溯的文件管理系统等管理咨询内容。通过这些咨询服务，使项目管理者对项目的个性特征、核心任务有明确认识，工作职责明确、责任感加强，工作信息得到良好传递。另一方面，应注意把握这一系统工程的内在联系规律，深刻认识设计、招标、合同管理(包括各专业合同、工程变更价款确认、工程经济鉴证、索赔文件等)、工程价款支付、材料采购、工程结算等各方面工作在这一系统工程中的作用和相互作用，在此基础上，合理设计流程，保证信息传递的严密、准确。总之，项目建设过程的各个阶段、各个方面、各个岗位的工作是紧密关联，不可分割的。通过建立完整、严密的信息传递和处理系统，才能保证造价咨询工作的有效性。&lt;/p&gt;
&lt;h3&gt;第三节 造价控制咨询服务方案&lt;/h3&gt;
&lt;p&gt;一、造价咨询服务的管理方案、目标&lt;/p&gt;
&lt;p&gt;1、造价咨询服务管理方案。&lt;/p&gt;
&lt;p&gt;根据《中华人民共和国招标投标法》、《中华人民共和国合同法》、《工程造价咨询单位管理办法》、《建设工程价款结算暂定办法》、GB50500-2008《建设工程工程量清单计价规范》、施工当地相关工程造价的政策和规定文件以及XXX的规定文件等，对项目实施造价咨询服务管理。&lt;/p&gt;
&lt;p&gt;2、造价咨询服务工作目标：&lt;/p&gt;
&lt;p&gt;建设工程造价须有效控制在批准的工程造价限额以内,随时纠正发生的偏差,保证项目投资目标的实现,以求在各个建设项目中能够合理地使用人力、物力、财力,以取得较好的投资效益,最终实现竣工决算控制在审定的概算额内,避免&amp;quot;三超&amp;quot;现象的发生。&lt;/p&gt;
&lt;h3&gt;第四节 造价咨询服务的工作内容&lt;/h3&gt;
&lt;p&gt;我单位根据本项目的建设内容及特点，造价管理工作总体任务分解为项目设计阶段、项目招标阶段、项目实施阶段、项目结算阶段四大阶段工作；&lt;/p&gt;
&lt;p&gt;一、项目设计阶段的造价控制咨询工作内容&lt;/p&gt;
&lt;p&gt;根据立项金额，项目前期咨询费、可行性研究费、投资估算、复核初步设计概算等费用，分析主要项目造价指标的合理性，限额设计指标分析和核定。&lt;/p&gt;
&lt;p&gt;二、项目招标阶段的造价控制咨询工作内容&lt;/p&gt;
&lt;p&gt;1、编制招标或非招标项目工程量清单、限价以及工程预算，分析主要工程量、分项（专项）工程造价指标的合理性、合规性，限额设计指标的换算和评定；协助编制、审核招标文件，提交相关计价、计量、支付、索赔等投资控制条款；&lt;/p&gt;
&lt;p&gt;2、审核工程招投标资格预审文件、招标文件，包括但不限于招标范围、招标内容，招标文件和施工、监理工合同中有关工程造价方面的相关条款进行查阅与补充，提出合理化建议；&lt;/p&gt;
&lt;p&gt;3、分析审核拟签施工、监理合同的合法性、合同文件和合同条款的完备性、合同的公平性、合同的应变性、合同文字的唯一性和准确性以及合同风险。保证对工程的控制权力，包括：工程变更权力，进度计划审批权力，实际进度监督权力，施工进度加速权力，质量的绝对检查权力，工程付款的控制权力，承包商不履约时甲方的处理权力等等。&lt;/p&gt;
&lt;p&gt;三、造价咨询工作内容&lt;/p&gt;
&lt;p&gt;1、制定适合本项目的造价控制管理办法，并负责向各参建单位宣贯。&lt;/p&gt;
&lt;p&gt;2、协助合同管理，包括合同变更谈判、变更的处理程序，落实变更的措施，修改变更相关的资料，检查变更措施的落实情况，协助委托人拟订补充合同。&lt;/p&gt;
&lt;p&gt;3、负责审核施工单位的工程预算和施工组织设计涉及的费用问题。&lt;/p&gt;
&lt;p&gt;4、协助委托人处理合同索赔，维护委托人的合法权益，防止索赔事件的发生。对收到的承包方的索赔报告进行审查分析，收集索赔和反索赔依据和证据，复核索赔值，起草并提出反索赔报告。&lt;/p&gt;
&lt;p&gt;5、调解合同争端，在仲裁过程中提供合法的依据。&lt;/p&gt;
&lt;p&gt;6、工程变更（包括：图纸会审、图纸修改、工程洽商等）对造价的影响分析，比较变更方案并提出优化建议，变更、签证费用审核。&lt;/p&gt;
&lt;p&gt;1）及时对经施工、监理单位的确认的施工合同中增补工程量清单综合单价的价格进行审核、确认。&lt;/p&gt;
&lt;p&gt;2）及时审核、确认、统计施工过程中发生的设计变更、工程洽商等经济费用，有效控制因工程变更引起的投资变化，每月进行成本变动分析并形成书面报告。&lt;/p&gt;
&lt;p&gt;7、工程进度款的审核。对施工单位提出每期进度款进行准确的审核，对下期用款进行较为准确的预测。&lt;/p&gt;
&lt;p&gt;四、结算阶段的造价咨询工作内容&lt;/p&gt;
&lt;p&gt;1、制订结算工作计划，竣工资料交齐后督促监理、施工单位按计划实施审核工作，在合同约定的时间完成结算初审。&lt;/p&gt;
&lt;p&gt;2、在结算初审完成报财评后，积极配合财评的审核工作。&lt;/p&gt;
&lt;p&gt;3、投资控制效果分析：对项目及实施过程的描述、估算、概算、预算、合同价及结算价进行比较，对产生差异的原因及投资控制的效果进行分析。&lt;/p&gt;
&lt;p&gt;五、其他工作&lt;/p&gt;
&lt;p&gt;1、建立合同台账、变更台账、签证台账、计量支付等台帐。&lt;/p&gt;
&lt;p&gt;2、负责定期收集和整理有关材料、设备的市场价格动态信息并提供给委托人。&lt;/p&gt;
&lt;p&gt;3、制订项目总体投资计划，并根据实际进度、每月实际投资与计划投资作分析比较，分析成本超支的原因和重估项目投资计划。&lt;/p&gt;
&lt;p&gt;六、工程计量与进度款审核&lt;/p&gt;
&lt;p&gt;工程计量是费用支出的基础，工程进度计量按有关施工合同和计价规范等进行计算，并做到：&lt;/p&gt;
&lt;p&gt;1、严格按施工图纸计算，对因施工单位自身原因而超出设计图纸部分内容不予考虑；&lt;/p&gt;
&lt;p&gt;2、注意工程量清单的描述和技术规范的要求，按工程量清单的设置原则计算进度工程量；&lt;/p&gt;
&lt;p&gt;3、只对质量合格的已完工程计量，而对质量达不到合同规定标准的已完工程不予计算。&lt;/p&gt;
&lt;p&gt;工程进度款按动态方式进行严格控制，进度款在支付证书审批后支付。&lt;/p&gt;
&lt;p&gt;七、工程变更和签证的审核及控制&lt;/p&gt;
&lt;p&gt;导致工程变更及签证的主要原因是：原设计有缺陷或设计人员有新的想法或业主有新的意愿及要求或现场环境等的变化。主要包括：&lt;/p&gt;
&lt;p&gt;1、合同中任何工程数量的改变，但不包括工程量清单与原设计图纸工程量的偏差（工程量偏差不属变更）；&lt;/p&gt;
&lt;p&gt;2、任何工程的删减，但不包括取消拟由发包人或其他承包人实施的工程；&lt;/p&gt;
&lt;p&gt;3、任何工作内容的性质、质量或其他特征的改变；&lt;/p&gt;
&lt;p&gt;4、工程任何部分的标高、基线、位置和（或）尺寸的改变；&lt;/p&gt;
&lt;p&gt;5、永久工程完工所必须的任何附加工作的实施；&lt;/p&gt;
&lt;p&gt;6、合同工程的施工次序和时间安排的改变。&lt;/p&gt;
&lt;p&gt;由于工程变更和签证会导致工程造价的变化，引发工程投资的失控，所以应严格按变更的流程进行管理，避免不必要的变更，并做好以下主要工作：&lt;/p&gt;
&lt;p&gt;1、严把设计质量关，减少设计变更；&lt;/p&gt;
&lt;p&gt;2、重视工程量清单编制和合同管理，降低业主风险；&lt;/p&gt;
&lt;p&gt;3、加强与设计单位的配合和合作，挖掘能降低造价的合理变更潜力；&lt;/p&gt;
&lt;p&gt;4、对不同类型的变更进行不同的管理；&lt;/p&gt;
&lt;p&gt;5、熟悉变更价款的确定原则与方法，合理确定变更价款；&lt;/p&gt;
&lt;p&gt;6、建立工程变更和签证档案，反映变更内容。如变更时间、类型、范围、原因和因变更引起的关键事件造成变化情况及变更申请者、业主认可方式和审批意见等，对变更和签证的工程造价进行合理控制。&lt;/p&gt;
&lt;p&gt;八、处理工程费用索赔和反索赔&lt;/p&gt;
&lt;p&gt;1、原因分析&lt;/p&gt;
&lt;p&gt;索赔（反索赔）是指在合同履行过程中，对于非自身的过错，应该由对方承担责任而对发生的实际损失向对方提出补偿的要求。由于施工现场条件的变化和施工进度、物价、合同条款、规范、标准文件、图纸等因素的影响，使工程施工过程出现索赔及反索赔。引起索赔及反索赔的主要原因有：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不利的自然条件与人为障碍；&lt;/li&gt;
&lt;li&gt;工期延长和延误；&lt;/li&gt;
&lt;li&gt;加速施工；&lt;/li&gt;
&lt;li&gt;施工临时中断和工效降低；&lt;/li&gt;
&lt;li&gt;业主不正当终止工程；&lt;/li&gt;
&lt;li&gt;建设风险和特殊风险；&lt;/li&gt;
&lt;li&gt;物价上涨；&lt;/li&gt;
&lt;li&gt;未按合同规定支付工程款；&lt;/li&gt;
&lt;li&gt;政策及规定调整；&lt;/li&gt;
&lt;li&gt;施工缺陷；&lt;/li&gt;
&lt;li&gt;工伤事故或损坏有关设施。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;2、注意事项&lt;/p&gt;
&lt;p&gt;为正确及时处理索赔和反索赔事件，避免业主的损失，有效控制工程投资，将做好以下主要工作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;熟知工地环境（包括派驻专人到现场上班及参加工地例会等）和熟悉合同等有关规定，分析可能引起索赔事项，及早防范，避免索赔事件的成立；&lt;/li&gt;
&lt;li&gt;准确判断施工单位的索赔是否成立，其条件是：与合同等有关规定对照，事件已造成了施工单位成本的额外支出；造成费用增加或工期损失的原因，按合同约定不属于施工单位的行为责任或者风险；施工单位按合同规定的程序提交了索赔意向通知和索赔报告；&lt;/li&gt;
&lt;li&gt;若施工单位索赔条件不具备，及时驳回施工单位的索赔申请，使索赔不能成立，减少工程的额外支出；&lt;/li&gt;
&lt;li&gt;当施工单位有过失（如施工缺陷等）时，依据合同及时向施工单位提出赔偿要求，达到反索赔的目的；&lt;/li&gt;
&lt;li&gt;当索赔事件不可避免发生时，分析费用索赔的项目构成。如人工费、材料费、机械费、分包费、管理费、利润等，准确确定哪些项目索赔不应该计算管理费用或利润；哪些不应该计算机械费或人工费；等等，合理确定索赔费用。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;九、分析投资编差和提出纠编措施&lt;/p&gt;
&lt;p&gt;在合理编制好资金使用计划后，就以此为依据进行投资偏差分析，当实际值偏离计划值时，分析产生偏差的原因，如工程变更、材料改变、质量事故、设计缺陷等等引起偏差，采取适当的纠偏措施进行控制。同时，根据已完工程的实际支出，预测建设工程投资的支出趋势，提出改进和预防措施对投资进行控制。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二、拟投入的我司人员安排&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;拟投入我司人员安排一览表&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;姓 名&lt;/th&gt;
&lt;th&gt;专业&lt;/th&gt;
&lt;th&gt;职称&lt;/th&gt;
&lt;th&gt;执业资格证明&lt;/th&gt;
&lt;th&gt;拟担任项目职务&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;证书名称&lt;/td&gt;
&lt;td&gt;证书编号&lt;/td&gt;
&lt;td&gt;级别&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投 标 人（法人公章）：&lt;/p&gt;
&lt;p&gt;法人代表（签名或签章）：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2017年 8月29日&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;第一节 团队组织架构&lt;/h3&gt;
&lt;p&gt;若我公司有幸中标，我们将根据该项目的特点委派具有从业资格的专业技术人员，在了解建设单位、工程项目的基本情况和评估审计风险的基础上，制定审计实施方案。方案审批后挑选具有丰富实践经验、专业齐全的专业人员组成服务团队，在主要负责人的组织下，按审批的审计方案和计划实施审计工作。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;media/image1.png&quot; alt=&quot;团队组织架构图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;第二节 造价管理团队的岗位职责&lt;/h3&gt;
&lt;p&gt;1、项目负责人岗位职责&lt;/p&gt;
&lt;p&gt;1）技术负责人负责对咨询业务专业人员的岗位职责、咨询业务质量和工作程序、方法、手段等进行管理。&lt;/p&gt;
&lt;p&gt;2）审核咨询成果文件，审定咨询业务实施工作方案、咨询条件、咨询原则及重要技术问题，并对审定的咨询成果质量负责。&lt;/p&gt;
&lt;p&gt;3）负责处理咨询项目负责人、审核人、校核人、编制人员之间的技术问题。&lt;/p&gt;
&lt;p&gt;4）协调处理咨询业务各层次、各专业人员之间的工作关系和技术分歧意见。&lt;/p&gt;
&lt;p&gt;5）负责重要计价依据、技术标准，审价条件的合法、合规、适用性审查；主持前期资料的收集、核对、确认和各类造价成果文件的汇总、调整、会签、送审、备案和建档工作。&lt;/p&gt;
&lt;p&gt;6）定期召集部内专题业务会，及时分析、诊治概预算、标底、结算编制、审核过程中存在的技术、进度、质量问题，助推队伍整体业务水平不断提升。&lt;/p&gt;
&lt;p&gt;7）负责造价信息（政策、市场）的收集、分析、积累和部门内共用物品、专用资料、各类工具书的合理使用和规范管理。&lt;/p&gt;
&lt;p&gt;2、造价工程师岗位职责&lt;/p&gt;
&lt;p&gt;1）负责工程项目造价咨询业务各子项、各专业之间的综合平衡、技术协调，组织管理等工作，并对本工程项目咨询质量负责；&lt;/p&gt;
&lt;p&gt;2）根据咨询业务实施工作方案，负责各专业咨询工作的调整或修改，统一咨询业务的技术条件和技术经济分析原则；&lt;/p&gt;
&lt;p&gt;3）掌握各专业咨询业务的实施情况，审查并确定各专业的技术经济关系，研究解决存在的问题；&lt;/p&gt;
&lt;p&gt;4）组织编写咨询成果文件，报公司造价技术总负责人审核。&lt;/p&gt;
&lt;p&gt;5）依据咨询业务要求，执行本岗位工作计划，遵守有关咨询业务的标准和原则，对所承担的咨询业务质量和进度负责；&lt;/p&gt;
&lt;p&gt;6）根据咨询业务实施工作方案的要求，开展咨询工作。选用正确的咨询数据、计算方法、计算公式、计算程序，做到内容完整、计算准确、结果真实可靠；&lt;/p&gt;
&lt;p&gt;7）做好咨询质量的自主控制，负责按审核意见进行修改；&lt;/p&gt;
&lt;p&gt;8）完成的咨询成果要符合规定要求，内容表述清晰、图表完整、规范；&lt;/p&gt;
&lt;p&gt;9）完成部门领导交办的其他工作。&lt;/p&gt;
&lt;p&gt;3、造价员岗位职责&lt;/p&gt;
&lt;p&gt;1）爱岗敬业，对自己所从事的专业工作有高度的责任心。&lt;/p&gt;
&lt;p&gt;2）公司施行部门经理负责制，成员服从部门经理的工作安排。&lt;/p&gt;
&lt;p&gt;3）根据咨询业务要求，执行作业计划，遵守有关咨询业务的标准原则，对所承担的咨询业务质量和进度负责，做到内容完整，计算准确，结果真实可靠。&lt;/p&gt;
&lt;p&gt;4）对承接的每一个项目均要为委托方保守秘密。&lt;/p&gt;
&lt;p&gt;5）进行市场调查，通过询价了解市场行情，掌握当前市场材料、设备、人工的价格及变化，积累相近时期的市场价格，做到编制出的成果文件能够准确的反映实际情况。&lt;/p&gt;
&lt;p&gt;6）熟练掌握计算机的操作，各种软件运用自如。&lt;/p&gt;
&lt;p&gt;7）加强业务学习，不断提高业务素质及技能，为自己今后的发展创造良好的基础。&lt;/p&gt;
&lt;p&gt;8）树立牢固的服务意识，对委托方及相关方态度和蔼，不急不躁，耐心解答对方的质询。&lt;/p&gt;
&lt;p&gt;9）同事之间团结协作、和平相处、取长补短，共同做好工作。&lt;/p&gt;
&lt;p&gt;10）出现问题及时纠正，不相互推诿，勇于承担责任。&lt;/p&gt;
&lt;p&gt;11）不得接受委托方、投标方的各种礼品、礼券、现金、财物等。&lt;/p&gt;
&lt;p&gt;12）认真完成造价工程师和部门领导交办的各项工作。&lt;/p&gt;
&lt;p&gt;4、校核人员&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;熟悉咨询业务的基础资料和咨询原则，对咨询成果进行全面校核，对所校核的咨询内容的质量负责;&lt;/li&gt;
&lt;li&gt;校核咨询使用的各种资料和咨询依据是否正确合理，引用的技术经济参数及计价方式是否正确;&lt;/li&gt;
&lt;li&gt;校核咨询业务中的数据引用、计算公式、计算数量、软件使用是否符合规定的咨询原则和有定，计算数字是否正确无误，咨询成果文件的内容与浓度是否符合规定，能否满足使用要求，各分项内容是否一致，是否完整，有无漏项;&lt;/li&gt;
&lt;li&gt;校核人员在校审记录上列述校核出的问题，交咨询成果原编制人员修改后进行复核，复核后方可签署并提交审核。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;5、审核人员&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;审核人员参与咨询业务准备阶段的工作，协调制订咨询实施方案，审核咨询条件和成果文件，对所审核的咨询内容的质量负责。&lt;/li&gt;
&lt;li&gt;审核咨询原则、依据、方法是否符合咨询合同的要求与有关规定，基础数据、重要计算公式和计算方法以及软件使用是否正确，检验关健性计算结果;&lt;/li&gt;
&lt;li&gt;重点为审核咨询成果的内容是否齐全、有无漏项，采用的技术经济参数与标准是否恰当，计算与编制的原则、方法是否正确合理，各专业的技术经济标准是否一致，咨询成果说明是否规范，论述是否通顺，内容是否完整正确，检查关健及相互关系;&lt;/li&gt;
&lt;li&gt;审核人员在校审记录单上列述审核出的问题，交咨询成果原编制人员进行修改，修改后进行复核，复核后方可签署。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外，造价项目部会增加文秘人员，主要负责文档的编制和存档、往来文件及邮件的收发等日常工作。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、工作流程及进度控制&lt;/h2&gt;
&lt;p&gt;一般咨询服务工作流程&lt;/p&gt;
&lt;p&gt;（1) 获取业务信息，接受委托人的邀请，提供咨询服务书等；&lt;/p&gt;
&lt;p&gt;(2)签订咨询合同，明确咨询标的、目的及相关事项；&lt;/p&gt;
&lt;p&gt;(3)接受并收集咨询服务所需的资料、踏堪现场、了解情况；&lt;/p&gt;
&lt;p&gt;(4)制定咨询实施方案；&lt;/p&gt;
&lt;p&gt;(5)根据咨询实施方案开展工程造价的各项计量、确定、控制和其它工作；&lt;/p&gt;
&lt;p&gt;(6)形成咨询初步成果并征询有关各方的意见；&lt;/p&gt;
&lt;p&gt;(7)按照有关各方的意见合理的调整并签批确定咨询成果资料；&lt;/p&gt;
&lt;p&gt;(8)咨询成果交付与资料交接；&lt;/p&gt;
&lt;p&gt;(9)咨询资料的整理归档；&lt;/p&gt;
&lt;p&gt;(10)咨询服务回访与总结；&lt;/p&gt;
&lt;p&gt;(11)咨询成果的信息化处理。&lt;/p&gt;
&lt;h3&gt;第一节 造价咨询服务的工作程序&lt;/h3&gt;
&lt;p&gt;一、设计阶段造价咨询的管理程序&lt;/p&gt;
&lt;p&gt;采购费用 → 施工费用 → 设计费用 → 接检费用 → 其它费用 → 工程结算 → 工程招标 → 执行概算及施工图设计 → 调整概算或修改施工图设计 → 比较分析 → 施工图设计概算 → 初步设计概算 → 施工图预算 → 施工图设计 → 初步设计（完成） → 总体设计（完成） → 总体设计估算（完成） → 方案设计（完成） → 投资估算（完成） → 可研报告（完成）&lt;/p&gt;
&lt;p&gt;二、施工阶段（设计变更）造价控制咨询的管理程序&lt;/p&gt;
&lt;p&gt;如果有新增单价 → 新增单价 → 设计变更实施 → 填写《工程变更洽商单》《工程联系单》 → 变更洽商 → 监理、设计、业主审批 → 设计单位出方案设计图 → 填写《设计变更申请表》 → 监理、设计、施工图审查、业主、发包方审批 → 设计单位出《设计变更通知单》及附图 → 填写《设计变更（计价）审批表》 → 监理、造价咨询、设计、施工图审查、业主、发包方审批 → 承包人首先报《新增（变更）材料/设备单价审批表》、《新增综合单价审批表》、《换算综合单价审批表》及相关分析表、审核表附件&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图10-2 施工阶段（设计变更）造价控制咨询的管理程序&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;三、施工阶段（签证审批流程）造价控制咨询的管理程序&lt;/p&gt;
&lt;p&gt;业主单位审核《新增（变更）材料/设备单价审批表》、《新增综合单价审批表》、《换算综合单价审批表》 → 填写《工程签证申请表》 → 监理单位审核 → 业主单位审核：签证是否实施 → 监理审核承包人上报的《新增（变更）材料/设备单价审批表》、《新增综合单价审批表》、《换算综合单价审批表》 → 承包人填写《新增（变更）材料/设备单价审批表》、《新增综合单价审批表》、《换算综合单价审批表》及相关分析表、审核表等附件 → 承包人填写《工程签证表》，并根据审批的《新增（变更）材料/设备单价审批表》、《新增综合单价审批表》、《换算综合单价审批表》编制签证预算填写《变更（签证）价款审批表》 → 监理单位审核《工程签证表》《变更（签证）价款审批表》、附审核书 → 业主项目部审核签证实际完成的工程量、合同造价部审核签证费用 → 业主项目主管领导审批 → 承包人&lt;/p&gt;
&lt;p&gt;如有新增单价 → 同意；无新增单价 → 不同意&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图10-3 施工阶段（签证审批流程）造价控制咨询的管理程序&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;四、施工阶段（材料、设备、构配件投标品牌的变更流程）造价控制咨询的管理程序&lt;/p&gt;
&lt;p&gt;注：1.此流程适用于施工单位变更投标品牌、招标推荐品牌以外品牌的办理流程
2.没有造价咨询的项目，由业主单位组织询价。&lt;/p&gt;
&lt;p&gt;品牌变更计划 → 施工单位（开工前或年度报计划） → 监理、业主审批变更计划 → 核实变更的原因 → 填报工作联系单、附表六 → 审核工作联系单、附表六 → 询价 → 确定厂家、审批单价 → 施工单位 → 监理单位 → 造价咨询 → 业主单位 → 提供材料需求、参数指标、定货时间要求，推荐三个厂家和报价 → 核实是否符合设计质量要求 → 拟定询价文件、询价、提交询价报告、确定单价 → 造价人员审批单价，公司领导审定、批准 → 造价咨询、业主拟定询价的厂家 → 造价咨询/业主单位推荐1-3家（共3-6家）&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图10-4 施工阶段造价控制咨询的管理程序&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;五、施工阶段（工程计量与支付流程图）造价控制咨询的管理程序&lt;/p&gt;
&lt;p&gt;承包人提出计量支付申请 → 业主合同造价部审核费用 → 监理单位审核上述资料并填写《本期工程形象进度确认表》 → 项目分管领导审核 → 发包方审批 → 工程服务类单位提出申请、填写《工程服务类酬金支付申请表》 → 业主管理部审核形象进度 → 服务、施工单位编制《工程计量支付申请书》 → 监理单位审核费用：出具监理支付证书 → 业主签发 → 业主公司领导审批 → 报政府项目部门、集中支付&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图10-5 施工阶段（工程计量与支付流程图）造价控制咨询的管理程序&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;六、竣工结算造价控制咨询的管理程序&lt;/p&gt;
&lt;p&gt;承包商（收到竣工验收证书后编制竣工资料） → 业主单位项目负责人审核 → 业主单位（项目管理部审核结算资料、合同造价部审核&amp;quot;竣工结算书&amp;quot;） → 业主审查&amp;quot;竣工结算书&amp;quot; → 财政部门评审结算 → 监理单位（审核&amp;quot;竣工结算书&amp;quot;） → 监理单位（审核竣工资料的真实性、完整性，签字盖章确认） → 业主单位（项目管理部审核结算资料） → 承包单位（根据竣工资料编制&amp;quot;竣工结算书&amp;quot;） → 不合格 → 竣工资料合格&lt;/p&gt;
&lt;p&gt;&lt;em&gt;图10-6 竣工结算造价控制咨询的管理程序&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;第二节 进度控制&lt;/h3&gt;
&lt;p&gt;1、工作计划&lt;/p&gt;
&lt;p&gt;根据具体项目工程规模、工期、同时施工专业工程等特点，合理制定各阶段目标，并进行有效控制&lt;/p&gt;
&lt;p&gt;2、主要阶段工作时间安排&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;阶段&lt;/th&gt;
&lt;th&gt;咨询事项&lt;/th&gt;
&lt;th&gt;造价咨询时间目标&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;一&lt;/td&gt;
&lt;td&gt;第一阶段&lt;/td&gt;
&lt;td&gt;工程招标及承发包合同签订阶段&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;审核工程量清单及招标标底&lt;/td&gt;
&lt;td&gt;收到工程量清单及标底之日起5个工作日内完成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;审核招标文件、资审文件&lt;/td&gt;
&lt;td&gt;收到招标文件、资审文件之日起3个工作日内完成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;审核拟签合同&lt;/td&gt;
&lt;td&gt;收到拟签合同之日起3个工作日内完成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;二&lt;/td&gt;
&lt;td&gt;第二阶段&lt;/td&gt;
&lt;td&gt;施工阶段&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;设计变更、工程洽商、工程签证的审核&lt;/td&gt;
&lt;td&gt;收到设计变更、工程洽商、工程签证之日起3个工作日内完成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;工程月进度款审核&lt;/td&gt;
&lt;td&gt;收到工程月进度款之日起3个工作日内完成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;三&lt;/td&gt;
&lt;td&gt;第三阶段&lt;/td&gt;
&lt;td&gt;竣工结算阶段&lt;/td&gt;
&lt;td&gt;收到竣工结算报告和完整的竣工结算资料之日起60天内完成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;四&lt;/td&gt;
&lt;td&gt;第四阶段&lt;/td&gt;
&lt;td&gt;配合政府审计完成本项目审计工作&lt;/td&gt;
&lt;td&gt;根据实际情况调整，以配合完成审计工作为前提&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;......&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;2、进度控制措施：&lt;/p&gt;
&lt;p&gt;中标后，立即与建设单位联系,全面了解项目情况，收集各项资料,为正式审计进行准备工作。进入正式审计阶段后，按照建设单位的时间要求以及项目的安排，确定正式审计的进点时间，针对项目的具体情况列出的工作进度计划，按要求及时完成审计工作。具体进度控制措施如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;依据委托单位提供的总体施工组织计划、投资计划、年度资金使用计划，依据各阶段不同要求，制订造价咨询人员进场计划。并定期与委托单位了解实际进展情况，按实调整计划偏差，以保证造价咨询有序实施。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重视日常资料的收集整理和校核工作，在平时的工作中，需要求施工单位报送资料一次完成，防止因资料不齐全后补资料而导致审计效率降低，审计进度拖延。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;项目人员的配备保持固定，专工在派驻项目执行造价咨询服务工作时，我公司将不再安排委派其他业务，并保证服务工作没有结束，人员不进行调换，以防止因专工换岗而影响审计进度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;及时解决服务工作存在的原则问题，我们要求项目组在碰到此类问题，及时向公司进行汇报，讨论后形成初部意见，并与各方会务，及时达成共识，指导造价咨询服务工作，保证审计工作高效运行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;提高造价咨询服务能力。公司定期对专工进行培训，并将各年度的工作案例进行讲解和讨论，传授工作技巧，提高项目组解决问题的能力；同时公司要求项目组在每项工作开展前统一工作标准，避免因标准不一致，影响审计工作质量和进度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;组织措施&lt;/p&gt;
&lt;p&gt;A、建立合理的项目组织结构，明确组织分工、任务分工和职能分工。按项目需要成立造价组，统筹、协调我单位人力、物力、财力等资源，筹划造价管理支撑工作的贯彻、实施，造价组由专业技术骨干人员组成，分为土建专业、机电安装专业、装饰专业、空调专业等小组。除造价控组人员外，还有技术支持组和配合工作组进行支持配合，落实各个组织、人员的岗位职责及工作内容等，充分发挥集体团队精神；&lt;/p&gt;
&lt;p&gt;B、编制项目造价控制工作计划，建立主要控制管理工作流程，如支付的程序、发包的程序等；&lt;/p&gt;
&lt;p&gt;C、做好施工阶段必要的技术经济分析与论证；&lt;/p&gt;
&lt;p&gt;D、建立投资控制管理信息系统，实行真正全过程控制管理；&lt;/p&gt;
&lt;p&gt;E、建立人员培训体系和绩效考核机制，完善以人为本的人员管理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;技术措施&lt;/p&gt;
&lt;p&gt;A、对工作变更进行技术经济分析，严格控制工程变更，并把变更分为重大变更（如变更造价在10万元以上）、重要变更（如变更造价在5~10万元）和一般变更（如变更造价在5万元以下）三种类型，区别不同类型进行不同的控制；&lt;/p&gt;
&lt;p&gt;B、继续优化设计图纸、通过完善设计、施工工艺、材料、设备、管理等方面挖掘投资节约潜力；&lt;/p&gt;
&lt;p&gt;C、审核施工组织计划的经济合理、暂定材料和暂定项目的价格等；&lt;/p&gt;
&lt;p&gt;D、加强设计交底和施工图纸会审工作，做好事前控制；&lt;/p&gt;
&lt;p&gt;E、及时、合理处理费用索赔和反索赔事项；&lt;/p&gt;
&lt;p&gt;F、加强技术规范管理，实现统一的业务流程等标准化技术，提高服务质量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;经济措施&lt;/p&gt;
&lt;p&gt;A、编制资金使用计划，确定造价控制目标；&lt;/p&gt;
&lt;p&gt;B、准确进行工程计量，并对未定工程量进行预测；&lt;/p&gt;
&lt;p&gt;C、复核工程付款账单，建立中期支付证书，审核付款凭证；&lt;/p&gt;
&lt;p&gt;D、进行支出跟踪控制，定期进行支出实际值与目标值的比较，发现编差，分析原因，采取纠编措施；&lt;/p&gt;
&lt;p&gt;E、及时收集工程项目投资信息、已完成的任务量情况信息和建筑市场相关成本指数等数据，并通过信息管理系统进行分析和预测；&lt;/p&gt;
&lt;p&gt;F、实行工作质量与经济效益挂钩的制度，对每位人员进行考核，并弘扬廉洁风气、抵制不正之风，严罚不公正人员，对触犯法律的追究刑事责任；&lt;/p&gt;
&lt;p&gt;G、对节约投资的合理化建议进行奖励。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;合同措施&lt;/p&gt;
&lt;p&gt;A、对施工合同的条款提供造价专业意见并协助合同谈判；&lt;/p&gt;
&lt;p&gt;B、合同实施、修改、补充过程进一步进行合同评审；&lt;/p&gt;
&lt;p&gt;C、及时收集、整理有关的施工、监理、变更等工程信息资料，为正确处理可能发生的索赔和反索赔提供依据，并避免或减少索赔事件的发生或索赔事件的成立；&lt;/p&gt;
&lt;p&gt;D、不与施工单位等串通损害贵司的利益，并遵守商业秘密，对涉及秘密的资料承担保密义务，不向外泄露；&lt;/p&gt;
&lt;p&gt;E、提供合法、有效的工作成果，并对其质量负责。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;四、质量控制措施&lt;/h2&gt;
&lt;h3&gt;第一节 质量控制制度&lt;/h3&gt;
&lt;p&gt;一、咨询文件编制管理制度&lt;/p&gt;
&lt;p&gt;1、招标文件编制&lt;/p&gt;
&lt;p&gt;a. 组织项目工作人员，任命项目负责人（由中级及以上职称人员担任），开展具体工作。&lt;/p&gt;
&lt;p&gt;b. 由项目负者人根据合同要求编制工作计划，主要是工作时间的安排及委托单位的协调等。&lt;/p&gt;
&lt;p&gt;c. 招标文件的编制，要根据国家有关法律、法规及省、市地方建设行政管理部门的招投标管理条例和实施细则，并与委托单位充分协商，保证招标文件的合理性、公正性、科学性。&lt;/p&gt;
&lt;p&gt;d. 招标文件初稿编制后，应提交部门领导会审签字，再提交公司有关领导审批。&lt;/p&gt;
&lt;p&gt;e. 根据有关领导的审批意见，进行调整招标文件，并上报建设行政主管部门最终审定。&lt;/p&gt;
&lt;p&gt;f. 未通过建设行政主管部门审定前招标文件不得外泄，通过审批后，才能在指定时间地点公开发布招标文件。并及时参加招标文件的答疑会，出具纪要。&lt;/p&gt;
&lt;p&gt;g. 如委托单位要求，可以代理招标机构工作人员身份，参与建设工程交易中心的开标、评标会议，并整理有关资料。&lt;/p&gt;
&lt;p&gt;h. 协助委托单位办理有关中标通知书、承发包合同的签订、承发包审批等有关手续。&lt;/p&gt;
&lt;p&gt;i. 整理招标活动中所有资料，全部移交给委托单位。&lt;/p&gt;
&lt;p&gt;j. 参与招标活动的人员部得泄露招标活动中的有关工作细节，违反者追究相应责任。&lt;/p&gt;
&lt;p&gt;2、工程造价文件编制&lt;/p&gt;
&lt;p&gt;a) 成立项目组织机构，任命项目负责人（由注册造价工程师担任），开展具体工作。&lt;/p&gt;
&lt;p&gt;b) 由项目负责人根据合同要求确定工作计划，主要是工作时间的安排，工作深度要求及委托单位的关系协调等。&lt;/p&gt;
&lt;p&gt;c) 工程造价文件的编制，要根据国家有关法律、法规及省市地方建设行政管理部门和有关部门的相关政策、文件，部分部确定因素如预算包干费、赶工费、风险金、设备及主材市场价的确定、新材料新工艺等，要与委托单位进行充分沟通，尽量争取委托单位的书面说明，保证工程造价文件的合法、公正、科学、准确、保密。&lt;/p&gt;
&lt;p&gt;d) 工程造价文件编制后必须复核，复核（调整）后交公司领导审定批准发出。&lt;/p&gt;
&lt;p&gt;e) 项目负责人将工程造价文件的编制有关情况直接向部门和公司有关领导汇报。&lt;/p&gt;
&lt;p&gt;f) 工程造价文件出版前必须由编制人、复核人签名。&lt;/p&gt;
&lt;p&gt;g) 委托单位在使用工程造价文件过程中需要对文件进行解释、说明。&lt;/p&gt;
&lt;p&gt;h) 工程造价文件出版后要及时收集、整理文件的信息反馈，并填表存档。&lt;/p&gt;
&lt;p&gt;二、审查（核）工程造价文件&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;成立项目组织机构，任命项目负责人（由注册造价工程师担任），开展具体工作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;项目负责人根据合同要求确定工作计划，主要是工作时间安排、工作深度要求及与委托单位的关系协调等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程造价的审查（核），要根据国家有关法律、法规及省、市地方建设行政管理部门和有关部门的相关政策、文件。对造价文件中依据部充分又无审查（核）依据的项目，必须与委托方取得联系，进行沟通。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程造价文件审查（核）报告须由报告复核人填报业务会签表，部分有关人员会签后，报公司领导批准出版。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程造价文件审查（核）报告出版后的解释工作由编制人和复核人负责。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;工程造价文件复核者负责收集、整理文件出版后的信息反馈工作，并填表存档。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;第二节 落实制度&lt;/h3&gt;
&lt;p&gt;1、回避制度：根据对工程项目的了解，对于与项目有任何利害关系的执业人员均不得入选本次审计项目。&lt;/p&gt;
&lt;p&gt;2、巡查制度：项目领导小组人员将定期对各项目现场进行巡回检查，其目的一是复核现场工作，二是就重大事项进行调研并及时解决问题。&lt;/p&gt;
&lt;p&gt;3、工作定期报告制度：现场项目小组成员做好审计日记，及时上报一次审计工作内容、结果及问题，对于现场难以确定的重大事项应随时以书面文件上报，项目领导小组应在及时予以回复。&lt;/p&gt;
&lt;p&gt;4、沟通制度：项目领导小组定期汇总驻现场项目组上报材料并根据重要性判断，上报给项目公司；现场项目组及时将审计进度、发现的问题以及遇到的难点以书面形式报告项目领导小组；对于在现场发现的特别重大问题随时通报。&lt;/p&gt;
&lt;p&gt;5、保密制度&lt;/p&gt;
&lt;p&gt;不得自行对外披露审计计划、审计内容和审计结果；未经项目公司允许，不得接受任何媒体采访；负责该项目审计的计算机在审计期间不得上任何公共网，所有软件资料单独保存。&lt;/p&gt;
&lt;h3&gt;第三节 人员保障&lt;/h3&gt;
&lt;p&gt;为确保全部审计工作的时间和质量，我们的安排是：&lt;/p&gt;
&lt;p&gt;1、由公司合伙人组成该项目审计的项目领导小组；&lt;/p&gt;
&lt;p&gt;2、所有专业人员在跟踪审计过程中自始至终不变动（项目公司要求的除外）；&lt;/p&gt;
&lt;p&gt;3、选派专业能力最强的人员组成结构科学合理的团队。&lt;/p&gt;
&lt;p&gt;我们将组成项目领导小组和项目工作小组，确定领导小组的组成并明确各自分工；按专业分工由骨干力量组成工程组和财务组。&lt;/p&gt;
&lt;h3&gt;第四节 充分准备&lt;/h3&gt;
&lt;p&gt;1、周密计划：充分了解项目公司及建设项目情况，收集相关资料，制订审计实施方案及具体审计计划，并报集团公司审核。所有审计工作的开展须以经审核同意后的方案为基本依据，以设计文件、招标文件、合同文件、施工文件、监理文件等作为具体从事跟踪审计的依据，严格按照审计实施方案确定的内容和时间，本着独立、客观、公正、公平、公开的工作原则，开展审核工作，从而达到对所跟踪建设项目的全过程的动态控制管理。&lt;/p&gt;
&lt;p&gt;2、高端配置：为了更好地组织好拟承办项目，我公司将从计算机等硬件资源上准备充分，使该项目达到计算机使用率100%。同时发挥我公司多年执业和广泛客户群积累的数据库信息系统优势，为业主在建设过程中进行方案比选、材料优用等方面提供方便、快捷、准确的建议，使项目投资性价比达到最高。&lt;/p&gt;
&lt;h3&gt;第五节 控制前移&lt;/h3&gt;
&lt;p&gt;为了保证审计的及时性，我们拟采取质量控制前移措施，将大量的审核工作在项目现场完成，随时发现问题、现场解决问题。具体包括：&lt;/p&gt;
&lt;p&gt;1、把握审计工作方向，确保现场紧紧围绕审计目标进行；&lt;/p&gt;
&lt;p&gt;2、及时审核工作成果，指导现场审计人员的下一步工作。&lt;/p&gt;
&lt;h3&gt;第六节 多层把关&lt;/h3&gt;
&lt;p&gt;加强审计质量的四级复核。现场工作小组在对全部审计工作计算、分析、比较、测量及调查取证的基础上，采用微机软件自动复核程序，整理形成所跟踪审计建设项目的初步审计意见，经项目负责人审核后，约请项目公司、施工单位等有关各方进行会审，并在三方达成共识的基础上会签。由项目负责人汇总工作底稿，起草审计报告，经公司四级复核批准，出具规范性、专业性的审计报告，同时做好相关审计资料和报告书的整理归档。&lt;/p&gt;
&lt;h3&gt;第七节 项目设计阶段造价控制咨询服务的管理措施&lt;/h3&gt;
&lt;p&gt;根据本项目的特点，我单位在设计阶段造价控制着重初步设计/技术设计、施工图设计各阶段进行设计优化、技术参数选定、专业设备选型、在达到功能要求的前提下，把限额设计作为投资控制的重要手段，利用科学控制方法，先进的控制手段和合理地确定本项目投资控制目标，要求设计组把目标分解到各专业设计岗位指标，规定设计各阶段测量、评审、跟踪、纠偏、难以及各专业接口、责任人和办法，确保限额总目标实现。&lt;/p&gt;
&lt;p&gt;1、初步设计阶段&lt;/p&gt;
&lt;p&gt;要求造价组用方案设计阶段估算作为初步设计概算的控制目标，初步设计概算按规划报建和建筑报建反馈的建筑、结构的选型，几何尺寸、功能要求、技术参数、材料设备选型等信息，制定科学、合理、实事求地反映初步设计的概算。经批准的初步设计总概算作为技术设计和施工图设计的投资控制目标。&lt;/p&gt;
&lt;p&gt;2、技术设计阶段&lt;/p&gt;
&lt;p&gt;1）施工图设计阶段&lt;/p&gt;
&lt;p&gt;施工图设计阶段是投资控制的又一关键阶段，要求设计管理组用技术设计修正概算作为施工图设计的控制目标，由设计单位依据这一阶段目标值，分解到各专业设计岗位指标，规定测量考核办法，明确项目造价咨询单位参与分阶段/总体评审/测量时间、接口、方法、内容以及信息反馈等。项目设计管理负责人根据设计单位报选的限额计划书，界定限额目标值与实标发生偏离时采取的纠正措施，验证责任人、接口和信息反馈，以及设计全过程评审/测量时间、频次等，确保实现施工图预算目标。&lt;/p&gt;
&lt;p&gt;2）通过优化设计控制投资&lt;/p&gt;
&lt;p&gt;要求设计管理组、造价组在明确以上各阶段按限定的目标值同时，对本项目开展方案/初步设计/技术设计/施工图设计优化过程在经验设计基础上采用先进的设计计算方法、理论与技术，共同过对多方案的技术经济分析对比，对提高工程设计质量，降低成本提高经济效益。&lt;/p&gt;
&lt;p&gt;二、招标阶段造价控制咨询服务的管理措施&lt;/p&gt;
&lt;p&gt;招标阶段是本项目投资控制管理的一个重要过程。我单位按项目造价咨询服务合同的约定，严格按照国家招投标法组织各专项工程及材料供应招标，择优选定设计、施工和主要材料设备供应单位，按《合同法》规定与中标单位签订合同，全过程监控各中标单位履行合同规定的权利和义务，切实保障本项目工程质量、工程进度和施工安全，严格控制工程造价。&lt;/p&gt;
&lt;p&gt;为做好本项目招标阶段的投资控制工作，我单位将加强以下环节的管理：组织资格审查&lt;/p&gt;
&lt;p&gt;1、我单位在投标前参与对申请投标的单位的概况、施工管理经验、信誉度、资金实力、以往工程实施业绩、管理水平、人力资源状况、项目合同相关条款的要求等进行严格细致的审查与考察，以保证参与投标的单位的综合实力水平，使项目质量目标、工期目标、造价控制目标的实现更有保障。&lt;/p&gt;
&lt;p&gt;2、要求招标代理单位确保招标文件的条款内容明确、合理、合法、文字周密、详实、规范，注意多专业、多标段的交接点及交接面划分、配合及衔接，力求全面分解工作，明确到位，不出现真空地带。特别是认真制订招标文件的合同条款中有关双方责任、工期、质量、验收、合同价款定价与支付、材料与设备供应、设计变更与现场签证、竣工结算方法和依据、争议、违约与索赔等均是影响工程造价控制的直接因素。&lt;/p&gt;
&lt;p&gt;3、工程量清单是编制招标工程标底价和投标报价的重要依据之一，也是支付工程进度款和办理竣工结算、调整工程量，以及工程索赔的重要依据。要求招标代理单位编制工程量清单数据要做到准确无误、无漏项、无重复，符合现行编制规定，要求造价组要反复核对，确保清单各子项的准确性，以防止投标单位采用技巧性投标，造成施工阶段的索赔。&lt;/p&gt;
&lt;p&gt;4、组织制定投标限价&lt;/p&gt;
&lt;p&gt;要求招标代理单位以投标限价作为各投标人报价的上限价，防范&amp;quot;围标抬标&amp;quot;：以限价下浮适当的百分率作为下限，防止恶性竞争，避免低于成本价中标，最终给承包商、委托人带来损失。在截标前将限价公开，引导各投标单位集中精力编制好投标文件，力求公平、公正、公开、科学、择优。&lt;/p&gt;
&lt;p&gt;5、材料设备招标&lt;/p&gt;
&lt;p&gt;材料价格对工程造价的影响很大。我单位对主要材料设备的采购采用两步招标法，要求招标代理单位分别进行技术招标和价格招标，不仅可以保证本项目选取材料设备的先进性、技术合理性，同时确保工程质量，而且更加贴近市场价格，直接为发包人节约投资。为此，我单位密切关注国内外市场相关材料设备的技术参数和价格水平，根据经审批的投资额，制定招标材料和设备的技术指标、质量标准、价格档次、安装标准以及培训和保修条款，由供货商按要求报价竞标，择优选用，以固定单价合同方式根据投标单价签订合同。&lt;/p&gt;
&lt;p&gt;6、组织制定风险防范条款&lt;/p&gt;
&lt;p&gt;本项目的建设过程相对存在许多风险和不确定性因素，比如第三者造成的停工风险(停水、停电)、不可抗力事件发生、投资环境恶化、材料设备供应中断等，这些因素给项目带来的风险会使项目投资额发生不正常变化，为了加强对不确定性投资的管理，我单位在进行招标和合同签订时，将非常注意制定报失、赔偿条款，认真界定不可抗力的范围，对于重大分解工程我单位运用工程投保等措施以使风险降低到最低。&lt;/p&gt;
&lt;p&gt;三、造价咨询服务的管理措施&lt;/p&gt;
&lt;p&gt;1、对施工阶段投资的事前控制&lt;/p&gt;
&lt;p&gt;1）督促设计管理组对设计图纸、设计要求、各专业施工承包合同涵盖的范围充分认识和正确理解，识别工程费用最容易突破的部分和环节，编制项目投资控制的敏感性模型，做到心中有数，从而明确投资控制的重点。（如：装修工程）&lt;/p&gt;
&lt;p&gt;2）督促设计咨询、造价组熟悉施工单位的投标报价书，对于采用综合单价包干的投标报价，审核其工程量清单的准确性，并预测工程量容易发生变动的项目，在施工过程中认真加强监测。&lt;/p&gt;
&lt;p&gt;3）工程开工前，组织好图纸会审工作，尽量避免事后设计变更造成的返工损失。督促设计咨询、造价组编制详细有效的建设项目管理方案和财务管理方案，组织审核施工单位上报的施工组织设计和施工方案，根据以往类似工程实际执行情况和有关经济指标、完成情况的分析资料并审定施工组织设计方案，对主要施工方案进行技术经济分析，积极推广使用先进的施工技术、工艺，降低施工成本。&lt;/p&gt;
&lt;p&gt;4）按合同要求，及时协调处理各种影响施工事宜，使各专业工程施工单位均能如期收到设计文件，按期进场施工，避免工期和费用索赔。&lt;/p&gt;
&lt;p&gt;5）开工前，根据工程投标文件及工程合同情况，与各专业工程施工单位明确工程计量、工程价款支付和工程变更费用等审批程序和使用表格。&lt;/p&gt;
&lt;p&gt;6）督促造价组审核各专业工程施工单位提交的依据施工图计算的工程量清单及项目用款计划并作好汇编整理工作，报委托方审查作为工程资金投放计划的依据：&lt;/p&gt;
&lt;p&gt;督促造价组根据各施工单位提交的工程量清单中详细列出的需要完成的项目以及各项目的工程量，对照施工单位的投标文件一一进行审查比较，了解投标文件中的项目。&lt;/p&gt;
&lt;p&gt;督促监理单位掌握施工单位对施工方法、施工过程、施工进度的要求以及工程量安排的特点，了解工程量形成和累积的过程，根据施工进度计划审核项目用款计划是否正确反映项目进展情况，特别是对照现场情况，预测和估计可能发生的工程变动，并作好与资金总控制计划的协调，督促施工单位按合同工期组织安排施工，避免增加不必要的赶工费用。&lt;/p&gt;
&lt;p&gt;督促造价组整理汇编工程量清单及制定合理的资金使用总计划，经项目负责人审核后报送委托方审核通过，作为控制施工阶段投资计划的依据，同时编制现金流量计划表，以便在施工中与实际工程费用支出进行分析比较。&lt;/p&gt;
&lt;p&gt;督促监理单位有效控制设计变更。严格制定设计变更、现场签证管理制度，明确造价管理部架构变更签证的权限范围，实行分级控制、限额签证，减少设计变更的随意性。&lt;/p&gt;
&lt;p&gt;2、施工阶段投资的事中控制&lt;/p&gt;
&lt;p&gt;1）督促监理单位及时对己完工程进行计量：监理单位现场造价人员、计量人员应对工程量清单和合同文件规定的各项费用，以及批准的工程变更和索赔等及时计量，计量依据为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工程量清单及技术规范中相应的计量支付说明；&lt;/li&gt;
&lt;li&gt;设计图纸；&lt;/li&gt;
&lt;li&gt;工程设计变更及洽商记录；&lt;/li&gt;
&lt;li&gt;合同条件、技术规范和投标文件：&lt;/li&gt;
&lt;li&gt;有关计量的补充协议和文件；&lt;/li&gt;
&lt;li&gt;索赔审批资料。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;工程计量，首先由各专业工程施工单位按约定的程序，向项目监理单位提交工程量签证审批表，造价管理部各专业工程现场主管在接报告后3天内核实所有己完工程项目的数量和价值，并作好记录。计量工作要依据图纸和现场的实物进行计算与实测。&lt;/p&gt;
&lt;p&gt;各专业工程已完工程量应经项目监理单位的专业监理工程师及项目造价部各专业工程现场主管签字认可。造价管理部各专业工程现场主管要对已计量的记录数据和工程量清单进行对比，列出增减的数据，供项目负责人作为控制拨款的依据和参考。&lt;/p&gt;
&lt;p&gt;工程量计量方法和计量单位要根据招标文件、工程合同、技术规范认真执行，做到不偏不倚，公正求实。&lt;/p&gt;
&lt;p&gt;2）工程价款支付程序化、规范化&lt;/p&gt;
&lt;p&gt;A、根据工程的节点要求，编制工程总用款计划和实施过程中的年、季、月用款计划，报委托方审批。&lt;/p&gt;
&lt;p&gt;B、根据审批的工程施工进度计划，监理单位复核施工单位当月经验收合格的工程量月报和下月用款报表(细分各单项工程，并以工程合同为依据编制预算)，作为每月应拨付工程款项的依据和下月的用款计划。&lt;/p&gt;
&lt;p&gt;C、根据工程合同、协议和约定的工程价款支付工作程序要求，本项目的工程价款的支付程序如下：首先由各专业工程施工单位填写&amp;quot;工程价款支付申请表&amp;quot;，先由项目监理单位对已完工程的数量、质量核实签认后签署工程款支付证明书，项目造价合同部长、现场主管工程师核实签认，经项目负责人审核后上报委托人审批，专款付至各具体实施单位。&lt;/p&gt;
&lt;p&gt;D、为便于发挥项目管理、协调的功能，拟采用如下工作流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;预付款：首先由各专业工程施工单位根据工程合同在规定时间内向项目监理单位提交&amp;quot;工程预付支付申请表&amp;quot;，项目监理单位签署预付款支付证明书送项目部审核，认可后送交委托人审批后向省财政部门申请拨款；&lt;/li&gt;
&lt;li&gt;月度进度款：首先由各专业工程施工单位于每月20日向项目监理单位提交&amp;quot;工程款支付申请表&amp;quot;，项目监理单位在3日内签署工程款支付证明书送项目造价部审核后送交委托人审批后向业主申请拨款。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E、工程价款支付申请表应附上的主要文件有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工程量完成统计报表；&lt;/li&gt;
&lt;li&gt;分项工程开工申请；&lt;/li&gt;
&lt;li&gt;各工序工程质量检验表及有关质量评定文件；&lt;/li&gt;
&lt;li&gt;工程变更费用审批表。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3) 工程变更费用&lt;/p&gt;
&lt;p&gt;A、慎重处理变更工程量：项目部、项目监理单位、委托人确认的工程变更程序，由工程施工单位向项目监理单位提交&amp;quot;工程(合同)变更费用审批表&amp;quot;，先由项目监理单位书送项目负责人审核签认后送交委托人审批后拨款。未经确认的变更报价不得进行计量支付。&lt;/p&gt;
&lt;p&gt;B、对影响工程顺利进行的有关应急技术措施、应急施工配合、施工图在施工过程中的紧急修改等，首先要由施工单位向项目监理单位申报后报项目负责人审批。&lt;/p&gt;
&lt;p&gt;认真审查把好文件关，通过投资控制促进各项工作。首先审查文件的完整性，资料不全的应要求施工单位补齐，或暂不办理计量：质量不合格的不办理计量，合格时方可申请。并由现场计量人员逐项核实施工单位所报计量工程是否己完，审查有关的质量保证资料的真实性与及时性，检查其他各项施工单位应负责的安全、文明施工等落实执行情况是否受控，通过工程款支付审批来反作用于质量、进度等方面工作，达到共同促进提高。&lt;/p&gt;
&lt;p&gt;监督工程投资动态，统计工程进度情况。定期将实际投资与合同费用及资金计划进行比较，找出偏差原因，提出控制工程费用的方案措施。&lt;/p&gt;
&lt;p&gt;按合同要求，及时联系、答复解决施工单位提出的问题和要求，搞好与设计单位、材料、设备供应单位的协调配合，避免造成违约和索赔。&lt;/p&gt;
&lt;p&gt;及时汇编施工承包单位资料，编制各阶段性的用款计划送XXX审定，所有临时追加用款先由项目监理单位审核并书面提出追加理由经项目负责人审核认可后，由我单位报委托人审定。&lt;/p&gt;
&lt;p&gt;对施工单位在施工过程中出现的违约情况，会通项目监理单位，保留记录并及时对施工单位提出索赔，并办理有关事宜。&lt;/p&gt;
&lt;p&gt;3、施工阶段投资的事后控制&lt;/p&gt;
&lt;p&gt;1）工程项目的竣工验收、工程竣工结算是投资控制的最后一个工作环节，是确定工程造价的最终手段，所以认真审核竣工验收资料、工程竣工结算、进行反索赔是重要环节。&lt;/p&gt;
&lt;p&gt;2）督促造价组、监理单位认真审核工程竣工资料汇编情况。工程竣工资料是准确进行工程结算的有力保证。由于在施工过程中存在着很多不可避免的变化，因此在投资控制的最后阶段必须认真审核竣工验收资料(包括工程变更、签证、修改记录等)是否齐全，资料所反映的内容是否准确、真实、竣工图是否标识明确、无误。&lt;/p&gt;
&lt;p&gt;3）督促设造价组准确审核竣工结算。依靠项目监理单位，划分不同时期的形象进度，根据已审核、汇编的工程竣工资料准确计算工程量、正确套用单价、合理套用各项取费标准，汇总材料差价和造价，全面审核工程结算书，防止通过虚报工程量、多报材料量、高套定额、重复计算等方式套取工程款及加大工程造价的问题发生；审核结果与施工单位进行协商，统一意见后签认，经项目监理单位审核后报项目造价部审定，最后报XXX审查确认。&lt;/p&gt;
&lt;p&gt;4）公正、合理处理施工单位提出的索赔为减少施工阶段的工程费用索赔，维护委托方利益，项目造价部会同项目监理单位，将加强对各种有可能造成费用索赔的因素的控制。在项目实施过程中，对可能引起的索赔的原因进行预测，如前期施工准备工作、进度、质量以及不利自然条件、人为障碍等。监督施工单位采取措施进行预防，减少不可抗力造成的损失。会造成费用索赔的情况发生后，督促项目监理单位必须及时进行调查取证，并及时捉出处理意见，对施工提出的各项费用索赔进行识别，力求站在公正的立场上。&lt;/p&gt;
&lt;p&gt;5）监督造价组公平、合理的给予签认，并报项目造价部审批。&lt;/p&gt;
&lt;p&gt;四、制定设备材料定价机制&lt;/p&gt;
&lt;p&gt;1、本项目设备材料定价的指导思想是：&lt;/p&gt;
&lt;p&gt;1）性能不得低于投标品牌，价格不得高于投标水平；&lt;/p&gt;
&lt;p&gt;2）设备材料定价的品牌及规格型号变更，价格应同时变更。&lt;/p&gt;
&lt;p&gt;3）设备材料定价的具体办法：&lt;/p&gt;
&lt;p&gt;以投标价、暂定价、指导价（指导价）的低值为定价的上限，原则上不得突破，其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如设备材料投标价为最低时，则按投标价执行，不再下浮。&lt;/li&gt;
&lt;li&gt;如设备材料暂定价为最低时，则按招标暂定价执行，不再下浮。&lt;/li&gt;
&lt;li&gt;如设备材料指导价（指导价）为最低时，则以指导价（指导价）为基础进行下浮，下浮费率分别为土建专业下浮0％至5％、装饰专业下浮5％至10％、安装专业下浮10％至15％、园林专业下浮10％至15％、市政专业下浮5％至10％。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;材料、机械及人工价差按各施工标段在投标时期所采用的信息价和指导价。&lt;/p&gt;
&lt;p&gt;清单已有项目或类似、类同项目（换算材料套用定额子目与原清单套用定额子目相同），应只按原有清单进行主材换算，此清单项目综合单价不再下浮。&lt;/p&gt;
&lt;p&gt;2、甲选乙供设备材料通过公开询价确定后的价格为结算价。&lt;/p&gt;
&lt;p&gt;3、乙供设备材料及非通过公开询价的甲选乙供设备材料确定后，如属新增项目及变更项目，施工单位应及时按《计量支付与设计变更管理办法》进行设备材料价格申报。&lt;/p&gt;
&lt;p&gt;4、注意事项&lt;/p&gt;
&lt;p&gt;1）甲选乙供设备材料范围因实际情况需要调整，由甲乙双方协商解决。&lt;/p&gt;
&lt;p&gt;2）甲选乙供设备材料与乙供设备材料确定后，因实际情况需要调整，参照《计量支付与设计变更管理办法》处理。&lt;/p&gt;
&lt;p&gt;五、投资管理措施&lt;/p&gt;
&lt;p&gt;1、组织措施&lt;/p&gt;
&lt;p&gt;本项目投资管理组织措施主要包括：建立投资管理责任体系，确定合理的工作流程；完善规章制度等，从而达到投资管理工作的程序化、业务的标准化。为方便计算机存贮和工作，还要做到数据资料的完整化和代码化。&lt;/p&gt;
&lt;p&gt;2、技术措施&lt;/p&gt;
&lt;p&gt;技术措施是降低投资的保证，在本项目施工实施阶段应严格执行工程设计变更审核程序，审核设计变更在技术上的必要性。发生设计变更时，应充分运用技术经济比较分析，找出既保证质量，满足工期要求，又降低成本的最佳方案。&lt;/p&gt;
&lt;p&gt;3、经济措施&lt;/p&gt;
&lt;p&gt;督促造价组做好本项目成本的预测和各种计划成本的编制，为成本管理打下基础；对各种支出做好资金使用计划，并在施工中进行跟踪管理，严格控制各项开支；及时准确地记录、收集、整理、核算实际发生的成本，并对后期的成本做出分析与预测，做好成本的动态管理；对各种变更，及时做好增减账；及时结算工程款。&lt;/p&gt;
&lt;p&gt;4、合同措施&lt;/p&gt;
&lt;p&gt;1）选用合适的合同结构对本项目的合同管理至关重要，在施工项目组织的模式中，有多种合同结构模式。在使用时选用适合于工程规模、性质和特点的合同结构模式。&lt;/p&gt;
&lt;p&gt;2）编制严谨细致合同条款，在本项目合同的条文中细致地考虑一切影响成本、效益的因素。特别是潜在的风险因素，通过对引起成本变动的风险因素的识别和分析，采取必要的风险对策。&lt;/p&gt;
&lt;p&gt;3）坚持全过程的合同管理，严格采用合同措施控制项目成本，并贯彻在合同的整个生命期，包括从合同谈判到合同终结的整个过程。合同谈判是合同生命期的关键时刻，一方面综合考虑本项目自身特点、建筑市场竞争激烈程度和合同的风险程度等因素，以调整不可预见风险费，确定合理的合同价格；另一方面选择最具合同管理和合同谈判方面知识、经验和能力的人作为谈判人进行合同谈判。在合同执行期间，积极履行合同，减少设计变更，对出现的设计变更，按规定的程序办理，为正确处理可能发生的索赔提供依据，并密切注视对方合同执行的情况，以寻求向对方索赔机会。&lt;/p&gt;
&lt;p&gt;六、对参建单位工作质量的管理措施&lt;/p&gt;
&lt;p&gt;1、设计单位工作质量的管理措施&lt;/p&gt;
&lt;p&gt;1）根据工程的特点，对设计单位建立适当的奖罚机制，主要是对设计进度、设计质量、优化设计等方面去鼓励设计单位高效、优质在设计限额内完成设计工作，并满足项目工期的需求。&lt;/p&gt;
&lt;p&gt;2）本项目在功能上需要使用大量的体育运动设施设备，而设备材料供应市场，根据我单位管理经验，设计单位按规定在设计中不能指定材料设备的品牌和型号，但往往在材料设备的技术参数选型上会出现唯一性或排他性，如果不采取约束措施，则会加大项目的采购成本，不利于投资控制。&lt;/p&gt;
&lt;p&gt;3）根据公共建筑项目的特点，结合项目建设进度的需求，建议由业主单位组织设计单位、使用单位尽早对功能需求、特殊专业、大型设备、特殊材料进行相关调研，以配合设计工作进度的需求和做好投资控制工作。&lt;/p&gt;
&lt;p&gt;4）对设计单位的设计进度、设计质量等实行考核处理，如达不到功能要求或由于设计单位的原因造成设计缺陷的对该单位进行处罚。&lt;/p&gt;
&lt;p&gt;2、监理单位工作质量的管理措施&lt;/p&gt;
&lt;p&gt;1）要求监理单位在制定投资控制管理制度时，对各职能工作岗位应分别指定专人负责（如签证的确认与复核，主要是明确专业监理工程师与造价工程师在投资控控制流程中的分工与职权），并确定互相监督、互相制约机制。&lt;/p&gt;
&lt;p&gt;2）所有办理的签证及审价单应及时上报造价部，经造价项目部确认后方可作为调整投资及工程结算依据。&lt;/p&gt;
&lt;p&gt;3）严格执行预结算编制、复核、批准的监督制度，对在审查中发现的问题要分清责任，严肃处理，并予以奖惩。&lt;/p&gt;
&lt;p&gt;4）要求本项目内所有监理单位对工程计量与结算管理的工作全部采用分开管理的管理模式，现场只对工程量、签证、变更等予以确认，结算则由监理公司另派造价工程师执行，严格根据施工合同、结算政策、造价信息等进行结算，以上相互制衡措施能有效防止出现的施工单位对现场监理部的干扰，确保本工程结算工作严肃公正性。&lt;/p&gt;
&lt;p&gt;5）要求监理单位严格执行廉洁自律措施规定凡违反上述规定者，由当事人作出书面检查并视情节轻重要求监理公司给予调离、辞退直至开除处分，触犯法律者移交司法机关处理。&lt;/p&gt;
&lt;p&gt;6）避免不合格工程支付,授权给总监理师认为后续工作不符合要求时，可拒签《工程款支付证书》。在单位工程结算审核时，工程必须通过验收合格。&lt;/p&gt;
&lt;p&gt;7）监督监理单位落实防重复计量、超前支付、超量支付。&lt;/p&gt;
&lt;h3&gt;第八节 项目实施阶段造价控制咨询服务的保证措施&lt;/h3&gt;
&lt;p&gt;我单位通过对本造价咨询项目招标文件、答疑纪要和其它相关文件的充分理解和研究，如我单位有幸中标，将作出以下保证措施：&lt;/p&gt;
&lt;p&gt;一、按《合同法》规定行使合同的全部权利义务，切实保障工程质量、工程进度和施工安全，严格控制工程造价。&lt;/p&gt;
&lt;p&gt;二、严格按照国家招标投标法，组织工程招标，择优选定设计、监理、施工和主要材料和设备供应单位，并与其签订合同。&lt;/p&gt;
&lt;p&gt;三、严格执行XXX下发的各项管理制度。&lt;/p&gt;
&lt;p&gt;四、协助发包人编制适合本项目的《设计变更管理办法》、《现场签证管理办法》《工程材料、设备、构配件管理办法》、《合同计量支付管理办法》对项目进行规范管理。&lt;/p&gt;
&lt;p&gt;五、根据工程节点要求，编制工程总用款计划和实施过程中的年、季、月用款计划，严格按照发包人规定的报批程序实施。&lt;/p&gt;
&lt;p&gt;六、根据审定的工程施工进度计划，复核监理单位上报的施工单位当月完成经验收合格的工程量月报和下月用款报表，作为每月应拨付工程款项的依据和下月的用款计划。&lt;/p&gt;
&lt;p&gt;七、严格执行基本建设管理程序，控制施工过程的造价、包括工程签证和设计变更。不随意变更建设规模、建设标准、建设内容和投资额。因技术、水文、地质等原因确需进行重大设计变更的，由项目设计单位填写设计变更单，并经设计管理组、造价组、监理单位、施工单位签署意见后，由我方报发包人审查核准后才能实施。&lt;/p&gt;
&lt;p&gt;八、自觉接受发包人及政府相关部门对本项目建设管理全过程的监督、审查。&lt;/p&gt;            </description>
            <pubDate>2026-05-14 05:08:58</pubDate>
            <link>https://www.syuez.com/blog/%E9%80%A0%E4%BB%B7%E6%8A%80%E6%9C%AF%E6%A0%87%E4%B9%A6.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E9%80%A0%E4%BB%B7%E6%8A%80%E6%9C%AF%E6%A0%87%E4%B9%A6.html</guid>
                                               <category>招投标</category>
                                    </item>
                <item>
            <title>道路及排水工程技术标书</title>
            <description>
            &lt;!--
author: admin
date: 2023-04-10
title: 道路及排水工程技术标书
tags: 道路, 排水
category: 招投标
status: publish
summary: 招投标~
--&gt;
&lt;h2&gt;道路及排水工程技术标书&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;室外道路及排水工程&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#一编制说明及编制依据&quot;&gt;一、编制说明及编制依据&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#编制说明&quot;&gt;1、编制说明&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#编制依据&quot;&gt;2、编制依据&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#二工程概况及特点分析&quot;&gt;二、工程概况及特点分析&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#总述及招标工程现场概况&quot;&gt;1、总述及招标工程、现场概况&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#工程特点及难点&quot;&gt;2、工程特点及难点&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#本次投标的施工目标&quot;&gt;3、本次投标的施工目标&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#施工组织整体设想&quot;&gt;4、施工组织整体设想&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#三施工平面布置&quot;&gt;三、施工平面布置&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#施工现场平面布置&quot;&gt;1、施工现场平面布置&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#施工总平面布置图&quot;&gt;2、施工总平面布置图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#四施工进度计划及确保工期的技术保证措施&quot;&gt;四、施工进度计划及确保工期的技术保证措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#总工期控制&quot;&gt;1、总工期控制&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#施工进度计划&quot;&gt;（1）施工进度计划&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#工期保证措施&quot;&gt;（2）工期保证措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#施工组织管理措施&quot;&gt;（3）施工组织管理措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#劳动力及机械化施工对工期的保证措施&quot;&gt;（4）劳动力及机械化施工对工期的保证措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#资金与材料方面对工期的保证措施&quot;&gt;（5）资金与材料方面对工期的保证措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#施工技术对工期的保证措施&quot;&gt;（6）施工技术对工期的保证措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#工期奖惩措施&quot;&gt;（7）工期奖惩措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#施工计划进度表&quot;&gt;2、施工计划进度表&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#工期保障措施&quot;&gt;3、工期保障措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#五工程投入的主要施工机械设备计划&quot;&gt;五、工程投入的主要施工机械设备计划&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#六各分部分项施工方案&quot;&gt;六、各分部分项施工方案&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;七、针对该工程的建议及该工程技术保障措施&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#八确保工程质量的技术组织措施&quot;&gt;八、确保工程质量的技术组织措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#质量目标&quot;&gt;1、质量目标&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#质量控制原则&quot;&gt;2、质量控制原则&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#主要人员职责&quot;&gt;3、主要人员职责&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#项目经理及项目班组成员职责&quot;&gt;（1）项目经理及项目班组成员职责&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#工程质量控制保证措施&quot;&gt;4、工程质量控制保证措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#工程质量控制措施&quot;&gt;（1）工程质量控制措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#施工过程质量控制&quot;&gt;（2）施工过程质量控制&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#施工过程分类及控制要点&quot;&gt;（3）施工过程分类及控制要点&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#工程质量保证措施&quot;&gt;5、工程质量保证措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#现场质量保证的承诺&quot;&gt;6、现场质量保证的承诺&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#九确保安全生产的技术组织措施&quot;&gt;九、确保安全生产的技术组织措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#安全生产目标及方针&quot;&gt;1、安全生产目标及方针&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#安全质量体系&quot;&gt;2、安全质量体系&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#安全生产保证措施&quot;&gt;3、安全生产保证措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#安全综合保证措施&quot;&gt;（1）安全综合保证措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#认真执行安全检查制度&quot;&gt;（2）认真执行安全检查制度&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#事故报告制度&quot;&gt;（3）事故报告制度&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#加强安全防护设置安全防护标志&quot;&gt;（4）加强安全防护，设置安全防护标志&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#抓好现场管理搞好文明施工&quot;&gt;（5）抓好现场管理，搞好文明施工&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#安全生产保证措施-1&quot;&gt;（6）安全生产保证措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#十确保文明施工的技术组织措施&quot;&gt;十、确保文明施工的技术组织措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#文明施工目标&quot;&gt;1、文明施工目标&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#文明施工措施&quot;&gt;2、文明施工措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#环境保护措施&quot;&gt;3、环境保护措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#噪音控制措施&quot;&gt;（1）噪音控制措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#污水处理措施&quot;&gt;（2）污水处理措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#降低扬尘措施&quot;&gt;（3）降低扬尘措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#十一雨季和冬季施工方案&quot;&gt;十一、雨季和冬季气候施工方案&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#雨期及冬季气候施工措施&quot;&gt;1、雨期及冬季气候施工措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#十二成品保护和工程保修工作的管理措施和承诺&quot;&gt;十二、成品保护和工程保修工作的管理措施和承诺&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#成品保护组织机构及管理&quot;&gt;1、成品保护组织机构及管理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#成品保护奖罚措施&quot;&gt;2、成品保护奖罚措施&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#十三售后服务承诺&quot;&gt;十三、售后服务承诺&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1、&lt;a href=&quot;#售后服务承诺书&quot;&gt;售后服务承诺书&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;十四&lt;a href=&quot;#十四项目组织管理机构及劳动力安排&quot;&gt;、项目组织管理机构及劳动力安排&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#项目组织管理机构职责划分&quot;&gt;1、项目组织管理机构职责划分&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#各部门职责&quot;&gt;（1）各部门职责&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#各岗位职责&quot;&gt;（2）各岗位职责&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#拟派项目组成员框架构成图&quot;&gt;2、拟派项目组成员框架构成图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#__RefHeading___Toc363643381&quot;&gt;3、项目班组成员一览表、项目经理、技术负责人简历表&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#__RefHeading___Toc363643382&quot;&gt;4、项目部成员及项目班组成员资格证、身份证&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#项目劳动力安排&quot;&gt;5、项目劳动力安排&lt;/a&gt;计划表&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;****首一期&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;室外道路及排水工程&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;施工组织设计&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;一、编制说明及编制依据&lt;/h1&gt;
&lt;h2&gt;1、编制说明&lt;/h2&gt;
&lt;p&gt;公司对能够参加该项目施工工程的投标，表示十分感谢。在认真阅读招标文件和对本工程现场实地勘查的基础上，组织了本次工程的投标工作。&lt;/p&gt;
&lt;p&gt;本次施工组织设计是指导该工程施工的纲领性文件，它体现了我公司对本工程施工的总体构思和部署。编制时对工期、质量目标、项目管理机构设置与劳动力组织、施工进度计划控制、机械设备及周转材料配备、主要技术方案、安全、文明施工、环保、季节性施工等诸多因素做了充分考虑，突出其科学性、适用性及针对性。在工程实施前还要编制详细的实施性施工组织设计或施工方案、措施及作业指导书，指导工程施工，确保在在规定的工期内完成工程的全部施工内容，按照质量体系和程序文件规定，严格把好材料、设备、成品和半成品的采购和检验关，使施工质量全过程受控，同时公司各类施工机械装备齐全，储备雄厚，根据工程实际需要，保证施工机械设备完全满足施工进度和质量要求。在文明施工管理上，我公司将按照国家建筑工程施工现场标准化管理规定，《建筑施工安全检查标准》(JGJ59-99) 行业规范组织现场文明施工，并遵照招标文件所附的合同专用条款中规定的执行，即参照建设工程文明工地创建活动的有关文件执行，并达到合格质量要求。&lt;/p&gt;
&lt;p&gt;本次施工组织设计是****首一期室外道路及排水工程项目的招标文件、答疑文件、施工图纸而编制的，是本工程的竞标文件，也是用以指导该工程施工的技术文件。我们抱着充分的诚意，极大的希望，热诚的态度，积极参与本工程的投标工作，工程施工全过程中按科学规律组织规范施工，有计划地开展各分部分项工程的施工，将及时做好各项施工准备工作，保证各种资源和劳动力的及时供应，协调各工序之间的时间安排，保证施工的顺利进行，按期保质完成施工任务。如果我公司中标，我们会克服一切困难，发扬我公司的优良传统，全力以赴，配备一流的人员班子、一流技术、一流的材料、一流的施工机具和超常的价格，以雄厚的企业整体实力为依托、精良的技术装备和丰富的管理经验为后盾，根据提供的资料进一步地优化施工方案，以先进科学的施工管理技术，更加合理地调动各种资源，保证以优良的质量、快捷的工期、优良的施工管理水平和优良的服务，按时交出令建设单位满意的工程。&lt;/p&gt;
&lt;p&gt;在施工中，我公司本着对建设单位高度负责的态度，将积极与质量监督部门配合，服从建设单位及监理工程师的管理，积极与业主、监理及有关工程建设管理单位密切配合，项目实施将完全按照国际标准ISO9000质量保证体系、严格按设计图纸和国家颁发的施工验收规范的要求，严格把好材料、设备、成品和半成品的采购和检验关，使施工质量全过程受控。同时，制定环保措施，控制噪音尘埃污染，减少投诉；制定安全生产措施，建立安全保证体系，确保施工中不发生伤亡事故，创建安全文明工地。以安全生产为中心，以优质、高效为目标进行工程施工，完成本工程的施工任务，将建设单位投资的每一分钱落到实处，以达到有效控制投资的目的，更好更快地交出让建设单位满意的精品工程。&lt;/p&gt;
&lt;h2&gt;2、编制依据&lt;/h2&gt;
&lt;h3&gt;（1）编制依据&lt;/h3&gt;
&lt;p&gt;① ****首一期室外道路及排水工程项目《施工招标文件》；&lt;/p&gt;
&lt;p&gt;② ****首一期室外道路及排水工程项目《招标答疑》；&lt;/p&gt;
&lt;p&gt;③ ****首一期室外道路及排水工程项目施工设计图纸；&lt;/p&gt;
&lt;p&gt;④ ****首一期室外道路及排水工程项目施工现场踏勘情况；&lt;/p&gt;
&lt;p&gt;⑤ 目前，我公司的设备配备，技术、施工人员配置及经济势力等情况；&lt;/p&gt;
&lt;p&gt;⑥ 本公司多年来对同类建筑工程积累的施工经验。&lt;/p&gt;
&lt;h3&gt;（2）编制规范、规程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《室外排水设计规范》（GB50014-2006）（2011年版）&lt;/li&gt;
&lt;li&gt;《室外给水设计规范》（GB50013-2006）&lt;/li&gt;
&lt;li&gt;《建筑给水排水设计规范》（GB50015-2009）&lt;/li&gt;
&lt;li&gt;《给水排水管道工程施工及验收规范》（GB50268-2008）&lt;/li&gt;
&lt;li&gt;《排水检查井》（02S515）&lt;/li&gt;
&lt;li&gt;《混凝土排水管道基础及接口》（04S516）&lt;/li&gt;
&lt;li&gt;《砖砌化粪池图集》（02S701）&lt;/li&gt;
&lt;li&gt;《雨水口》（05S518）&lt;/li&gt;
&lt;li&gt;《排水管道出水口》（06MS201-9）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;（3）主要规范&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;类别&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;名称&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;编号&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;国家&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;中华人民共和国消防法&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;主席令第4号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;中华人民共和国合同法&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;主席令第15号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;中华人民共和国环境保护法&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;主席令第22号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;中华人民共和国大气污染防治法&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;主席令第32号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;中华人民共和国安全生产法&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;主席令第70号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;中华人民共和国节约能源法&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;主席令第90号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;中华人民共和国建筑法&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;主席令第91号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;中华人民共和国计量法&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;主席令第128号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;城市市容和环境卫生管理条例&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;国务院令第101号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设项目环境保护管理条例&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;国务院令第253号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设工程质量管理条例&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;国务院第279号令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设工程安全生产管理条例&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;国务院令第393号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建筑安全生产监督管理规定&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设部令第13号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设工程施工现场管理规定&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设部令第15号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;房屋建筑工程质量保修办法&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设部令第80号&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;（4）其他规范&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;类别&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;名称&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;编号&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;其他&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;质量管理体系要求&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;GB/T19001-2000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;环境管理体系规范及使用指南&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;GB/T24001-1996&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;职业健康安全管理体系规范&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;GB/T28001-2001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;《质量保证手册》&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;《环境管理手册》&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;《职业安全健康管理手册》&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;二、工程概况及特点分析&lt;/h1&gt;
&lt;h2&gt;1、总述及招标工程、现场概况&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;工程名称：****首一期室外道路及排水工程&lt;/p&gt;
&lt;p&gt;建设单位：******置业有限公司&lt;/p&gt;
&lt;p&gt;建设地点：***经济技术开发区*********&lt;/p&gt;
&lt;p&gt;建筑概况：本次招标为首一期室外雨、污、废水排水管道，包括管道沿线检查井、化粪池等室外排水构筑物及沥青道路雨水口（不含景观施工范围内雨水口及其连接管）等，全部按图纸要求施工到位。具体划分如下：&lt;/p&gt;
&lt;p&gt;1、**地块：&lt;/p&gt;
&lt;p&gt;**楼：室外雨水管由起始井**及**施工至预留井**，起始井**施工至****，污水管由起始井**及**施工至预留井JW2**；雨水口施工范围为：接入雨水井******6个雨水口。&lt;/p&gt;
&lt;p&gt;**楼：室外雨水管由起始井**施工至预留井JY3**，污水管由起始井**施工至预留井****，废水管由起始井**施工至预留井FB7**；雨水口施工范围为：接入雨水井**6个雨水口。&lt;/p&gt;
&lt;p&gt;2、**地块：&lt;/p&gt;
&lt;p&gt;**楼：室外雨水管由雨水井**施工至YC15，污水管由污水井**施工至****；雨水口施工范围为：接入雨水井**内2个雨水口。&lt;/p&gt;
&lt;p&gt;**楼：室外雨水管由起始雨水井**施工至YM7**，污水管由起始污水井**及**施工至**，且含施工过程中破除市政道路路面及恢复路面的全部工程量，市政道路路面破除及恢复面积按**m²计；雨水口施工范围为：接入雨水井**3个雨水口。&lt;/p&gt;
&lt;p&gt;**楼：室外雨水管由起始雨水井**及**施工至YL12，污水管由起始污水井*****及**施工至**；雨水口施工范围为：接入YL21、YL22、YH5、YH6、YH8、YL14、YH12、YL16、YH14、YL17内14个雨水口。&lt;/p&gt;
&lt;p&gt;3、市政主马路：&lt;/p&gt;
&lt;p&gt;雨水管由****施工至**，包括道路两侧雨水口，污水管由****施工至**，且需将污水井**连接至雨水井**段**管道及雨水井**排放至庙湖段D800管道封堵。&lt;/p&gt;
&lt;p&gt;4、首一期室外道路的按招标图纸要求及范围施工完成。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;2、工程特点及难点&lt;/h2&gt;
&lt;p&gt;（1）通过对工程的设计图纸、周边环境的分析、研究，并根据现场的多次踏勘结果，我们认为本工程的重点是前期准备工作、施工期间的防尘、防噪声措施和人群疏导等一系列工作。&lt;/p&gt;
&lt;p&gt;（2）其中前期准备工作是整个工程施工的重心，从现场踏勘的情况来看，前期的保护监控、施工区域的隔离工作量比较大，而且施工时一定要把对相关周边人群疏导及相关配套功能的影响减少到最小程度。如考虑不周势必影响到后期施工进度，因此前期准备工作的质量好坏将决定整个工程成败。&lt;/p&gt;
&lt;p&gt;（3）施工期间的噪声、灰尘控制将采取以下措施：采用施工隔离挡板进行施工区域的隔离并加以标语进行指示相关人员。&lt;/p&gt;
&lt;h2&gt;3、本次投标的施工目标&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;(1) 工程质量目标：合格，坚持&amp;quot;质量第一&amp;quot;的宗旨，正确处理好&amp;quot;质量、工期、成本、安全&amp;quot;四者关系，确保工程达到合格标准。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;（2）安全文明施工目标：合格；&lt;/p&gt;
&lt;p&gt;（3）工期目标：首一期土石方工程计划开工日期为**** 年**月**日，完工日期为****年**月**日，共**个日历天；首一期道路工程计划开工日期为****年**月**日，完工日期为****年*月**日，共**个日历天；首一期排水管网工程计划开工日期为****年*月**日，完工日期为****年*月**日，共**个日历天；首一期化粪池工程计划开工日期为****年*月**日，完工日期为****年*月*日，共**个日历天。我公司将完全响应。&lt;/p&gt;
&lt;p&gt;贯彻ISO9001：2000系列标准。坚持：&amp;quot;三级监督，五步到位&amp;quot;的质量控制标准，消灭返工现象，以工作质量保证产品质量。&lt;/p&gt;
&lt;p&gt;① 三级监督&lt;/p&gt;
&lt;p&gt;项目经理部技术监督→公司技术质量部门的质量监督→业主委托的监理单位监督。&lt;/p&gt;
&lt;p&gt;② 五步到位&lt;/p&gt;
&lt;p&gt;在分项施工中，管理人员做到：操作要点交底到位；上、下工序交接到位；上、下班交接到位；关键部位的检查、验收到位；各种材料和加工件进场验收到位。&lt;/p&gt;
&lt;h2&gt;4、施工组织整体设想&lt;/h2&gt;
&lt;h3&gt;（1）现场准备&lt;/h3&gt;
&lt;p&gt;① 我公司在接到发包方的中标通知书后，将立即委派人员进场，对原有的设计、道路等接收，复核中心线、标高尺寸，在通过有关单位验收后，方可破土动工；&lt;/p&gt;
&lt;p&gt;② 根据本工程施工现场具体情况，结合本工程施工工期紧等特点，我公司考虑现场搭设临时设施及安排机械停放场地和相关材料堆放、焊接等场地；&lt;/p&gt;
&lt;p&gt;③ 及时做好进场机械设备的安装调试工作；&lt;/p&gt;
&lt;p&gt;④ 供水、供电&lt;/p&gt;
&lt;p&gt;⑤ 通讯&lt;/p&gt;
&lt;p&gt;项目经理部工程负责人及技术员、施工队负责人每人配移动电话一部。&lt;/p&gt;
&lt;p&gt;⑥ 施工测量及试验&lt;/p&gt;
&lt;h3&gt;（2）物资设备准备&lt;/h3&gt;
&lt;p&gt;① 根据施工图预算、分项工程施工方法和施工进度安排，对各种工程材料、周转使用材料、外加工制品、施工机具等物资制定需要计划；&lt;/p&gt;
&lt;p&gt;② 根据各种物资需要计划，组织加工、供应地点和供应方式、签定物资供应合同和制定运输计划；&lt;/p&gt;
&lt;p&gt;③ 按照总平面图的要求，将物资按计划时间，在指定地点、按规定方式进场储存和堆放。&lt;/p&gt;
&lt;h3&gt;（3）劳动力组织准备&lt;/h3&gt;
&lt;p&gt;① 在本工程施工中，根据各分项工程的规范和技术要求，结合工期情况安排施工队伍进场，并进行岗前培训教育；&lt;/p&gt;
&lt;p&gt;② 建立和健全各项劳动力管理制度；&lt;/p&gt;
&lt;p&gt;③ 制定详细的劳动力进场计划。&lt;/p&gt;
&lt;h3&gt;（4）技术准备&lt;/h3&gt;
&lt;p&gt;① 熟悉招标文件和合同精神及有关规范要求；&lt;/p&gt;
&lt;p&gt;② 熟悉和会审设计图纸，检查各种几何尺寸是否正确一致；&lt;/p&gt;
&lt;p&gt;③ 编制总体施工组织设计和分项工程施工方案；&lt;/p&gt;
&lt;p&gt;④ 编制施工图预算和施工预算；&lt;/p&gt;
&lt;p&gt;⑤ 编制总体控制计划，确保工序搭接时间；&lt;/p&gt;
&lt;p&gt;⑥ 绘制各种阶段的场地布置图；&lt;/p&gt;
&lt;p&gt;⑦ 制定材料运输方案。&lt;/p&gt;
&lt;h3&gt;（5）场外准备&lt;/h3&gt;
&lt;p&gt;① 与材料和半成品的供应单位签订供应合同，并作好原材料的检验和复验工作。&lt;/p&gt;
&lt;p&gt;② 组织施工机械和周转材料进场；&lt;/p&gt;
&lt;p&gt;③ 向有关政府部门提交开工申请报告，领取项目施工许可证，办理安全、质量监督手续；&lt;/p&gt;
&lt;p&gt;④ 与当地卫生、环保、市容、街道、交通部门、派出所、工商所等部门取得联系，办理有关手续。&lt;/p&gt;
&lt;h3&gt;（6）施工阶段大致的划分&lt;/h3&gt;
&lt;p&gt;路面开拓工程：场地平整→原有地面破除→底层平整原土打夯→水稳层铺设→砼路面浇筑→沥青路面浇筑→工程收尾。&lt;/p&gt;
&lt;p&gt;管道施工：测量、放样→原有路面破除→开挖沟槽→垫层基础→安管、护管→接口、管座施工→检查井等构造物安装→闭水试验→回填夯实。&lt;/p&gt;
&lt;p&gt;化粪池施工：基坑土方开挖→基坑土体护坡加固→基坑降水→基坑底部清槽→铺垫层下卵石或碎石层→混凝土垫层→砌筑池壁红砖→化粪池顶盖及圈梁支模、绑筋、浇注混凝土→化粪池顶盖预制板制作→化粪池顶盖拆模→抹化粪池内壁、外壁防水砂浆，化粪池外壁涂热沥青→作化粪池24H灌水实验→土方回填→化粪池预制顶盖安装。&lt;/p&gt;
&lt;h1&gt;三、施工平面布置&lt;/h1&gt;
&lt;h2&gt;1、施工现场平面布置&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;用途&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;面积（m²）&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;位置&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;需用时间&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;仓库&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;700&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;详见施工总平面图所示&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;至项目完工&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;加工棚&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;500&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;详见施工总平面图所示&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;至项目完工&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;项目部办公室&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;300&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;详见施工总平面图所示&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;至项目完工&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;生活区&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;800&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;详见施工总平面图所示&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;至项目完工&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;注明：以上区域设置均在甲方指定设置范围内&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;2、施工总平面布置图&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;详&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;见&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;投&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;标&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;文&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;页&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;四、施工进度计划及确保工期的技术保证措施&lt;/h1&gt;
&lt;h2&gt;1、总工期控制&lt;/h2&gt;
&lt;h3&gt;（1）施工进度计划&lt;/h3&gt;
&lt;p&gt;根据招标文件、合同、工程量、投入的资金及劳动力确定本工程的施工进度计划。工程总工期目标和阶段控制目标如下：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① 计划总工期&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首一期土石方工程计划开工日期为**** 年*月*日，完工日期为**年*月*日，共**个日历天；首一期道路工程计划开工日期为**年*月*日，完工日期为****年*月*日，共**个日历天；首一期排水管网工程计划开工日期为**年*月**日，完工日期为**年*月**日，共**个日历天；首一期化粪池工程计划开工日期为**年*月**日，完工日期为**年*月*日，共**个日历天。我公司将完全响应。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 计划的编制&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;⑴ 为保证各阶段目标的实现，基础、结构施工根据平面布置原则和流水段划分原则，组织各区段内流水段的施工。&lt;/p&gt;
&lt;p&gt;⑵ 为实现各个目标,采取三级计划进行工程进度的安排和控制，除每天与工程相关各方的工作例会外，每日下午4:30召开各分包的日计划和计划安排协调会，以解决当日计划落实过程中存在的矛盾问题并且安排第二日的计划和所调整的计划，以保证周计划的完成，通过周计划的完成控制保证整体进度计划的实现。&lt;/p&gt;
&lt;h3&gt;（2）工期保证措施&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;⑴ 工期的技术保证措施&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;（1）施工进度计划管理措施&lt;/p&gt;
&lt;p&gt;1）施工进度计划的编制&lt;/p&gt;
&lt;p&gt;a、根据我们以往同类工程的施工经验、科学的施工组织及先进的计算机网络控制技术，制订本项目总体和各单位工程两级网络进度控制计划。是保证总计划实现的关键性措施。&lt;/p&gt;
&lt;p&gt;b、为保证总计划的实现，在总体网络计划中设置多个关键进度控制点，该控制点是施工阶段性目标，是编制各专业进度计划的依据。&lt;/p&gt;
&lt;p&gt;c、依据总进度计划，项目经理部编制旬进度计划，施工专业队依据旬进度计划编制日进度计划，并于每天生产例会提出经各专业队平衡认可后作为第二天计划，发给各有关执行人。编制的计划确保可操作性及实用性。&lt;/p&gt;
&lt;p&gt;d、抓好关键线路和关键工序，应用微机进行动态管理、不断优化。进度计划要得到业主确认，充分考虑业主对工期提出的要求，确保总进度计划的顺利实施。&lt;/p&gt;
&lt;p&gt;（2）计划的执行与控制&lt;/p&gt;
&lt;p&gt;建立例会制度：每周一次的工程总结会，做阶段性总结；每周一次的工程例会，安排月、周进度；日巡查会，作业进度。并做日报、周报和月报。控制保证计划的层层落实。施工中影响进度及各专业协调的问题在例会及时解决。如工期有延误要找出原因制定追赶计划。编制施工进度计划的同时编制相应的人力、资源需用量计划如劳动力计划、现金流量计划、材料、构配件的加工、装运到场计划等。并派人跟踪，确保资源满足计划执行的需要，为计划的执行提供可靠的物质保证。&lt;/p&gt;
&lt;p&gt;在施工过程中，如果业主对某单位工程工期提出具体的要求，我公司将制定专门的、有针对性的赶工措施，组织充足的机具和人力资源，保证业主工期目标的实现。&lt;/p&gt;
&lt;h3&gt;（3）施工组织管理措施&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;（1）项目班子&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;强化项目管理，推行项目法施工，实行项目经理负责制。项目经理对施工全过程负责，统一组织，确保工期。我司将选派曾经施工过同类工程的一级项目经理担任该工程的项目经理，该同志有丰富的现场施工组织管理经验和协调能力；总工程师由有类似工程施工经历并有多年施工经验的工程师担任，同时将集中经验丰富、精力充沛的现场工程师担任施工员。强大的项目管理班子将确保工期有组织地实现。&lt;/p&gt;
&lt;p&gt;与业主、监理等单位密切配合，及时协调，以计划为龙头，有指令性地安排施工任务，每周开好生产协调会和技术协调会。每周向业主提交工程进度报告。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（2）采用微机技术加强调度和工期动态管理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;合理安排工序穿插和工期，建立主要形象进度控制点，运用微机辅助的网络计划跟踪技术和动态管理方法。坚持周平衡、日调度，确保总进度计划实施。为了充分利用施工空间、时间应有流水段均衡施工工艺，合理安排工序，在绝对保证安全质量的前提下，充分利用施工空间，科学组织安装和装修二者的立体交叉作业。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（3）施工组织管理方面的其它措施&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1）严格各工序施工质量，确保一次验收合格，杜绝返工，以一次成优的良好施工质量获取工期的缩短。&lt;/p&gt;
&lt;p&gt;2）充分发挥群众积极性，开展劳动竞赛，对完成计划好的予以表扬和奖励，对完成差的予以批评和处罚。加强工序管理，为最大限度地挖掘关键线路的潜力，各关键工序施工时间，装修阶段各工种之间建立联合签认制确保空间、时间充分利用。&lt;/p&gt;
&lt;h3&gt;（4）劳动力及机械化施工对工期的保证措施&lt;/h3&gt;
&lt;p&gt;（1）为确保工期，我司将选择具有很高专业素质的施工队进场承担施工任务。施工人员相对固定不会因农忙日或农忙季节导致劳动力缺乏。&lt;/p&gt;
&lt;p&gt;（2）实行项目成本核算制，充分利用经济杠杆的作用，把施工进度、工程质量、文明施工等要素与效益紧密挂钩，调动作业人员的积极性和工作热情。优化生产要素的配置，组织专业化队伍，采用劳动竞赛的形式，充分发挥职工的积极性，提高劳动生产率。&lt;/p&gt;
&lt;h3&gt;（5）资金与材料方面对工期的保证措施&lt;/h3&gt;
&lt;p&gt;（1）本工程执行专款专用制度，以避免施工中因为资金问题影响工程进度。同时专款专用制度也为项目经理部应付万一某一环节完不成关键日期而采取果断措施提供了保证。&lt;/p&gt;
&lt;p&gt;（2）本工程材料和零星材料由项目经理部统一采购，现场检验验收。在资金保证和材料供应等方面的有力保证下，工程进度完全有保障。&lt;/p&gt;
&lt;h3&gt;（6）施工技术对工期的保证措施&lt;/h3&gt;
&lt;p&gt;（1）积极推广应有新工艺、新材料，从科技进步方面争取加快进度。&lt;/p&gt;
&lt;p&gt;（2）项目总工程师和各专业工程师指导、协助施工队及时解决施工中出现的各种技术问题，做好详细的施工方案和施工技术交底，在编制材料计划、加工件计划等时充分考虑合理的损耗系数，做到既满足施工需要，又不能造成浪费。与设计、监理和甲方随时联系及时把问题解决，保证施工的正确性和连续性。&lt;/p&gt;
&lt;p&gt;（3）采用新材料，压缩工序流水节拍。严格按设计、标准、规范和工艺施工，做到分部、分项一次合格，杜绝返工，用高质量保证施工进度。&lt;/p&gt;
&lt;h3&gt;（7）工期奖惩措施&lt;/h3&gt;
&lt;p&gt;为确保本工程按照计划工期保质保量地顺利施工，我公司在落实一系列管理措施的同时，制定奖惩措施，运用经济杠杆来调动生产工人的积极性。&lt;/p&gt;
&lt;p&gt;（1）制定工序工期奖惩措施，对一些直接影响到下道工序开工和总工期关键工序，项目部根据总体计划向各施工队伍下达作业计划的同时，进一步明确责任人和完成时间，对提前或推迟完成的原因要进行分析，提出奖惩措施，本工程的奖惩以日历天计算，特殊工序以小时计算。&lt;/p&gt;
&lt;p&gt;（2）为控制各区域或某一阶段工期，项目部将计划层层分解，组织各施工队伍之间开展各种形式的劳动竞赛，对提前完成的施工任务给予奖励，对滞后严重的要提出处罚，形成施工热潮。&lt;/p&gt;
&lt;p&gt;（3）在与各施工队伍签定劳务合同时，把工期要求纳入主要条款，制定奖惩措施。&lt;/p&gt;
&lt;h2&gt;2、施工计划进度表&lt;/h2&gt;
&lt;h2&gt;3、工期保障措施&lt;/h2&gt;
&lt;p&gt;工期目标：科学组织施工，合理安排工序穿插，确保合同工期。&lt;/p&gt;
&lt;p&gt;☞ 如若中标，我单位将按照投标书承诺书的保证，以最快的速度进点，边建设临时设施，边进一步深入现场调查，依据设计图纸，编制实施性施工组织设计，积极做好开工准备，为下一步全面开展施工创造条件。&lt;/p&gt;
&lt;p&gt;☞ 我方保证按投标书提报的机械设备力量和人员组成投入施工，严格按照批准的施工组织设计安排施工进度，确保工期。&lt;/p&gt;
&lt;p&gt;☞ 实现机械化、标准化作业，以加快施工进度。&lt;/p&gt;
&lt;p&gt;☞ 抓好施工黄金季节的计划安排，充分利用网络技术，根据优化的网络安排，从技术、设备、劳力上保证关键线路的需要，实施平面、立体交叉作业，同时抓好非关键线路，同步展开，整体推进工程进度。&lt;/p&gt;
&lt;p&gt;☞ 建立健全完善的技术保障体系，确保施工生产顺利进展和加速施工进度，实行总工程师质量总负责的技术责任制，配备足够的有施工技术经验的工程技术人员，除编制好实施性施工组织设计外，对关键工序还必须编写施工方案；认真执行技术交底制，实行分项工程施工前的现场技术交底制度，技术交底必须成为施工生产的依据，确保施工质量和安全生产，加快施工进度。&lt;/p&gt;
&lt;p&gt;☞ 合理划分流水段，扩大工作面，加快施工进度。&lt;/p&gt;
&lt;p&gt;☞ 结构分段验收，尽早穿插检查工序。&lt;/p&gt;
&lt;p&gt;☞ 安排好职工生活，开展劳动竞赛，加快工程进度。&lt;/p&gt;
&lt;p&gt;☞ 认真遵守国家和地方行政主管部门颁布的各项法规，加强同业主、设计、监理、科研部门的联系，加强与地方政府及各有关部门、四邻百姓的联系、协调、合作，减少扰民和民扰。&lt;/p&gt;
&lt;p&gt;☞ 加强工程进度的计划性：&lt;/p&gt;
&lt;p&gt;⑴ 施工期间建立进度控制的组织系统，按进度控制计划进行阶段工程进度目标分解，确定其进度目标，编制月、旬作业计划，做到日保旬，旬保月，并做好施工进度记录；&lt;/p&gt;
&lt;p&gt;⑵ 加强施工中进度控制，将实际进度与计划进度对比，及时调整；&lt;/p&gt;
&lt;p&gt;⑶ 建立现场会、协调会制度，每周召开一次现场会，每天召开生产调度协调会，加强信息反馈，及时协调各工种进度，确保工期目标实现；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;☞ 加强成品保护工作：&lt;/p&gt;
&lt;p&gt;⑴ 做好成品保护工作，减少返工、返修浪费，加快施工进度；&lt;/p&gt;
&lt;p&gt;⑵ 对全体员工加强教育，晓之以理，在施工过程中做到自觉自律。在每天的班前会上，要求班长要强调职工的成品保护意识，提高员工的职业道德和职业素养；&lt;/p&gt;
&lt;p&gt;⑶ 建立一套严格的管理体系和管理制度，做到成品保护有制度，成品保护工作有人负责。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;五、工程投入的主要施工机械设备计划&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;拟投入的主要施工机械设备表&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;一、申请人计划用于本工程的主要机械设备&lt;/strong&gt;&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;种类（名称）&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;数量&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;型号规格&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;产地&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;已使用年限&lt;/th&gt;
&lt;th&gt;无&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;砂浆搅拌机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;QTZ-80&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;山东&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;挖掘机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;SC100&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;山东&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;砼搅拌机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;JZ350&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;广西&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;钢筋切断机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;QJ40－1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南通&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;钢筋弯曲机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;GJ7－40&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南通&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;钢筋对焊机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;UN1－150&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南通&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;直流电焊机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;RT888&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南通&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;交流电焊机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;B×-300&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南通&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;型材切割机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;J3GQ－400&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南通&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;木工圆锯机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;MLQ222A／1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南通&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;11&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;台式钻床&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;LT－16J&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南通&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;高压水泵&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;11／2GC5×5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南通&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;13&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;压路机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;JQB-2/2-6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南通&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;14&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;插入式振捣器&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;18&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;Z×-50&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;山东&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;15&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;平板式振捣器&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;ZB5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;山东&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;16&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;蛙式打夯机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;LW-60&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;山东&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;17&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;卷扬机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2吨&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;山东&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;18&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;砂浆机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;UJ325&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;山东&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;19&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;发电机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;250KW&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;泰州&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;挖掘机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;EX160WD&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;日本&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;21&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;载重汽车&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;HQG3102FD3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;22&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;灰浆搅拌机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;200L&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;江苏&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;23&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;施工专用面包车&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;15&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;东风中型面包车&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;武汉&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;二、申请人计划用于本工程的主要仪器&lt;/strong&gt;&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;种类（名称）&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;数量&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;型号规格&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;产地&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;已使用年限&lt;/th&gt;
&lt;th&gt;无&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;全站仪&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;GTS-311&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南京&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;垂准仪&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;DZJ3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南京&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;水准仪&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;NA2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南京&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;水准仪&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;DS3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;南京&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;钢卷尺（50m）&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;LF－11&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;钢卷尺（30m）&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;LF－11&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;钢塔尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;N3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;线锤&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;台秤&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;塞尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;11&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;靠尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;水平尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;13&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;坍落度筒&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;14&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;温度计&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;15&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;干湿温度计&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;16&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;卡尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;17&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;游标尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;18&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;对讲机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;Motorola&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;湖北&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;六、各分部分项施工方案&lt;/h1&gt;
&lt;h2&gt;1、管沟开挖施工方案&lt;/h2&gt;
&lt;p&gt;根据招标文件及图纸要求，该项目管道敷设分为内线和外线两部分，武汉经济技术开发区沌口路汉阳造纸厂。&lt;/p&gt;
&lt;p&gt;挖土机挖土至管底设计标高20cm处，然后人工开挖修整沟槽至管底设计标高，开挖沟规格根据实际敷设管道型号设定沟宽，随即铺砾石砂垫层，下管，连接，坞塝合格后粗砂回填至管顶(或按设计规定)并振实，整个施工过程应一气哈成，确保快速优质。&lt;/p&gt;
&lt;p&gt;自卸汽车运土方，运至指定地点，土方开挖分段进行，每段20米，第一段20米，土方外运，第一段施工完后开挖下一段，所挖土方回填前一段。&lt;/p&gt;
&lt;h2&gt;2、施工工序流程&lt;/h2&gt;
&lt;p&gt;排水管道具体施工工序为：测量放线-土方开挖-清基底-基底垫层-混凝土管对口-砼检查井-上部砼-通水试验-土方回填；&lt;/p&gt;
&lt;p&gt;给水管道具体施工工序为：测量放线-土方开挖-清基底-沙垫层-管道防腐-管道安装-通水打压-土方回填。&lt;/p&gt;
&lt;h2&gt;3、测量放样工序&lt;/h2&gt;
&lt;h3&gt;（1）测量放样&lt;/h3&gt;
&lt;p&gt;① 施工测量控制网&lt;/p&gt;
&lt;p&gt;a布网方案设计&lt;/p&gt;
&lt;p&gt;本工程呈半规则固定形式，施工测量控制线布设对应施工图纸，具体施工时，视具体情况作方案补充，由现场监理审定。&lt;/p&gt;
&lt;p&gt;该测量控制线的布置既要考虑主体施工各环节的需要 ，更要注意地下部分施工过程中，开挖沟槽及降水的影响。&lt;/p&gt;
&lt;p&gt;b标桩结构及埋设&lt;/p&gt;
&lt;p&gt;组织测量人员进行复核测量；在不影响施工的地方布置控制水准点及建立三角攀桩；开槽铺设管道的沿线临时水准点，每20m不少于1个；&lt;/p&gt;
&lt;p&gt;控制图点采用钢筋砼标桩，标桩顶部埋设不锈钢标板，作平面控制点标绘用：顶部预埋不锈钢棒作高程控制点(顶部制凸球形)，标桩四周用5~6皮砖砌筑围护，填土夯实作观测平台，平台四周埋设角钢或钢筋，用红白油漆相间涂抹，做到醒目易认，利于使用和保护。&lt;/p&gt;
&lt;p&gt;② 施工测量&lt;/p&gt;
&lt;p&gt;a平面基准测量&lt;/p&gt;
&lt;p&gt;以业主提供基准点为依据，根据设计图轴线坐标的布置 ，采用平面坐标测量法测放轴线，一次测量到位。轴线坐标控制点投测完毕后，互相间就进行校核，同时可检验偏差情况，以便及时纠正误差。&lt;/p&gt;
&lt;p&gt;b 高程测量&lt;/p&gt;
&lt;p&gt;根据业主提供高程控制点，用水准仪在沿线布设导线点，同时布置高程控制点，用水准仪、水准尺，尺垫将高程控制点引测至施工现场不受施工影响的地方，并经常进行复核校正。&lt;/p&gt;
&lt;p&gt;引测临时水准点必须符合精度必须满足《给水排水管道工程施工及验收规范》(GB50268-97)中的规定：&lt;/p&gt;
&lt;p&gt;C 施工过程中各工序测量作业注意点：&lt;/p&gt;
&lt;p&gt;① 每次作业前必须对仪器各项限差进行检验；&lt;/p&gt;
&lt;p&gt;② 根据工程的进度和施工影响程度，组织控制网的定期和不定期检查；&lt;/p&gt;
&lt;p&gt;③ 不得孤立使用平面控制中的某两点或某一条方向线，至少应该检测其与相邻点或线无误后，方可使用；&lt;/p&gt;
&lt;p&gt;④ 每次施测必须保证闭合条件的存在，没以闭合条件存在时，只能用不同的施工路线检核；&lt;/p&gt;
&lt;p&gt;⑤ 发现异常时，必须及时上报，以便于及时采取措施。&lt;/p&gt;
&lt;p&gt;所挖土方自卸汽车进行运土方，运至指定地点，土方开挖分段进行，每段20米，第一段20米，土方外运，第一段施工完后开挖下一段，所挖土方回填前一段。&lt;/p&gt;
&lt;h2&gt;4、管道工程&lt;/h2&gt;
&lt;h3&gt;（1）管道安装工程一般施工程序&lt;/h3&gt;
&lt;p&gt;现场测绘 → 绘制加工草图 → 支吊架制作 → 管道预制 → 支吊架油漆 → 防腐 → 安装准备 → 支吊架安装 → 管道安装 → 设备安装 → 设备接口 → 系统试压 → 系统防腐 → 单机试车 → 系统吹扫 → 系统试运转&lt;/p&gt;
&lt;h3&gt;（2）管道安装一般要求&lt;/h3&gt;
&lt;p&gt;搬运及储存&lt;/p&gt;
&lt;p&gt;在管道施工过程和装卸运输到现场或指定地点时，必须采取必要的措施保护管子和零配件、内外的防腐免受损坏，这些措施包括合适的吊钩、卡箍、保护性封堵、支撑等所有其它必要的措施。管子、零部件等的搬运方式应遵照相关国家标准。阀门应采取可以保护支座、汽门、圆盘、操作装置避免曝光、风化或其它环境原因的损坏的方式储存。所有的工程中未安装管子、零部件和阀门的要有临时性保护，管子和零部件应堆放在平整的地上。塑料管子、零部件和阀门存放时，应避免阳光直射，以便整根管子周围的气流平稳。&lt;/p&gt;
&lt;h3&gt;（3）管道安装技术要求&lt;/h3&gt;
&lt;p&gt;与管道有关的土建工程经检验合格，满足安装要求，与管道接连的设备安装、固定完毕，必须在管道安装前完成的有关工序，如清洗、内部防腐与等已进行完毕，管子、管件及阀门等已经检验合格，并具备有关的技术文件，管子、管件及阀门已按设计要求核对无误，内部已清理干净，不存杂物，管道的坡向，坡度应符合设计要求，管道的坡度，可用支座下的金属垫板调整，吊架用吊杆螺栓调整。垫板应与预埋件或钢结构进行焊接，不得加于管子和支座之间，管道穿越道路，应加套管或砌筑涵洞保护，与传动设备连接的管道，安装前必须将管道内部清理干净，其固定焊口一般应远离管道，当设计或设备制造厂无规定时，对不允许随附加外力的传动设备，在设备法兰与管道连接前，应在自由状态下，检查法兰的平行度和同轴度偏差在所规定的有关偏差之内。管道安装合格后，不得承受设计外的附加载荷，管道经试压、吹扫合格后，应对该管道与设备的接口复位检查，其偏差应符合规定，如有超差，应重新调整，直到合格。&lt;/p&gt;
&lt;h3&gt;（4）阀件安装的技术要求&lt;/h3&gt;
&lt;p&gt;安装阀件前应检查填料是否完好，压盖螺栓有否足够的调节余量。法兰或螺纹连接的阀件应在关闭状态下安装。安装阀件前，应按设计核对型号，根据介质流向其定安装方向。水平管道上阀件，其阀杆一般应在安装上半圆范围内。阀件传动杆轴线的夹角不应大于30度。其接头应转动灵活，有热位移的阀件，传动杆应具有补偿措施。阀件的操作机构和传动装置应做必要的调整和整定，使其传动灵活，指示准确。&lt;/p&gt;
&lt;h3&gt;（5）室外管道安装&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;沟槽开挖&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;沟槽开挖采用机械挖土、人工修正的并用方法，基底15～20cm土方人工清理至设计标高，施工时不得扰动原状土，严禁起挖，如发生超挖或扰动，必须按规范要求进行地基处理后，方可进行管道的垫层铺设。沟槽拟采用单侧堆土，距槽顶边≥1米，堆土高度不≤1.5米，以免产生塌方。开挖沟槽，基础不能当天铺设时，必须将基底土方留住，等到做基础的当天再挖至设计标高，以免沟槽长时间暴露。&lt;/p&gt;
&lt;p&gt;沟槽排水：采用单面排水沟，边沟宽30厘米，深50厘米，并设集水坑，用水泵强排至地面排水系统。&lt;/p&gt;
&lt;p&gt;沟槽开挖检查标准&lt;/p&gt;
&lt;p&gt;管沟中心线偏移：&amp;lt;100 mm；管沟标高：+50 mm；管沟宽度：±100mm。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;管道基础垫层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;基础的底层土应无淤泥和碎土，如有超挖应用砂砾石填实，不得用土回填，槽底也应无积水。基础施工前必须复核高程样板的标高以控制挖土面、垫层面和基础面。&lt;/p&gt;
&lt;p&gt;在沟槽开挖完成，经监理验收合格后，即可进行垫层施工，&lt;img src=&quot;media/image1.png&quot; alt=&quot;&quot; /&gt;{width=&amp;quot;0.6527777777777778in&amp;quot; height=&amp;quot;0.625in&amp;quot;}沟槽不得长时间暴露于空气中。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;布管&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本工程所需的施工材料，经车辆运至现场后设堆管区，采用钢板平车用挖掘机将管道拖运就位的方法沿管线走向布管，在布管中承口方向应和敷管方向一致。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下管&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;根据现场的实际情况，选用汽车吊或挖掘机起吊，装卸下管过程中，严禁用钢丝强穿心吊运。起吊时轻起轻落，防止碰撞损坏管端。在下管时对口间隙控制在20厘米左右，&lt;/p&gt;
&lt;p&gt;下管前将管内杂物及承口清理干净、对管道合缝处毛刺进行处理，下管采用机械下管,使其慢慢平稳放入沟槽内。下管时应有专人指挥,操作人员必须听从指挥，不得与沟壁或沟底剧烈碰撞。并应遵循下列要求：严禁超载；在吊臂回转半径的影响范围内不得障碍物和站人；操作人员上下沟槽时，应采用扶梯，扶梯应高出地面1m，并应密切配合。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;管道安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本工程采用挖掘机或吊机同电动葫芦相配合进行安装，安装时用水准仪控制好其标高，经纬仪控制其轴线。&lt;/p&gt;
&lt;p&gt;为减少沟槽内接头焊接工作量，安管前首先在沟槽边将钢管焊成型，做好内外防腐后，下入沟槽安装焊接。&lt;/p&gt;
&lt;p&gt;钢管组焊前，检查管节表面应无斑疤、裂纹、严重锈蚀等缺陷。同一管节允许有两条纵缝，纵向焊缝间距就应大于300 mm。焊接前应先修口、清根，管端端面的坡口角度、钝边、间隙应符合有关规定。&lt;/p&gt;
&lt;p&gt;管道安装前，管节应且逐根测量、编号，宜选用管径相差最小的管节组对对接。下管前应先检查管节的内外防腐层，合格后方可下管。&lt;/p&gt;
&lt;p&gt;混凝土钢管对口检查合格后，采用橡胶垫圈接口进行处理，进行封闭。在施工防腐层之前，必须对管道的内外表面进行除锈处理。&lt;/p&gt;
&lt;p&gt;对于接头橡胶垫圈部分，严禁有溶渣蚀锈和其他遗物，并保持清洁和干燥，垫圈施工完毕后应进行严格检查，除外观检查外，必要时还需进行油渗试验。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;管道系统试验&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;管道安装完毕后，应按设计规定对管道系统进行强度、严密性等试验，以检查管道系统及各连接部位的工程质量；&lt;/p&gt;
&lt;p&gt;用水作介质进和强度及严密性试验；&lt;/p&gt;
&lt;p&gt;试验前应清除管内垃圾及脏物，需要时用水冲洗；&lt;/p&gt;
&lt;p&gt;试验前，应将不能参与试验的系统、设备、仪表及管道附件等加以隔离，安全阀，爆破板应拆卸，加置盲板的部位应有明显的标记和记录；&lt;/p&gt;
&lt;p&gt;管道系统试验前，应与运行中的管道设置盲板，对水或汽管道如以阀门隔离时，阀门两侧温差不应超100度。&lt;/p&gt;
&lt;p&gt;试验过程中如发生泄漏，不得带压修理，缺陷消除后，应重新试验；&lt;/p&gt;
&lt;p&gt;系统试验合格后，试验介质宜在室外合适地点排泄，及时拆除所有临时盲板，核对记录，填写《管道系统试验记录》并按规范要求进行管道系统吹扫与清洗。&lt;/p&gt;
&lt;p&gt;试验过程中升压速度应缓慢，设专人巡视和检查试验范围的管道情况。试验用压力表必须是经校验合格的压力表，量程必须大于试验压力的1.5倍以上。管道末端必须装压力表。&lt;/p&gt;
&lt;p&gt;试验合格后，试验介质的排放根据现场实际情况排放。压缩空气为试验介质的管道排放时要朝上排放，周围严禁有人作业。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;管道系统吹扫与清洗&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;管道系统强度试验合格后，分系统及材质对管线进行分段吹扫与清洗。&lt;/p&gt;
&lt;p&gt;空气系统用压缩空气为介质进行吹扫，给排水等管道用水为介质进行清洗。&lt;/p&gt;
&lt;p&gt;吹洗的顺序按主管、支管、疏排管依次进行，不允许吹洗的设备及管道与吹洗系统隔离。&lt;/p&gt;
&lt;p&gt;吹洗前，将系统内的仪表予以保护，排除管道附件（孔板、喷咀、滤网、节流阀、止回阀芯安全阀等），设专人负责保管，吹洗后按原位置及要求复位。&lt;/p&gt;
&lt;p&gt;大口径管道（DN≥600）在封闭前进行清扫，并派专职检查员与甲方代表、监理工程师一起检查后封闭，并填写隐蔽记录交有人员认可。&lt;/p&gt;
&lt;p&gt;吹洗前，根据实际情况安装临时管道和设备，并对吹扫管道进行检查，支吊架加固。选择适当的排放口。&lt;/p&gt;
&lt;p&gt;管道吹洗合格后，根据吹洗过程中的情况填写《管道系统吹扫记录》交有关人员签字认可。拆除临时吹洗管道，检查及恢复管道及有设备。并不得再进行影响管内清洁的其它作业。&lt;/p&gt;
&lt;h3&gt;（6）现场钢管焊接施工&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;钢管焊接施工的一般要求&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;焊接材料必须符合设计规定，焊材质量必须符合现行的有关国家规范要求；焊材要有出厂质量证明书；施工现场必须建立完善的验收、保管、烘干、清洗、发放制度。&lt;/p&gt;
&lt;p&gt;焊工必须持证上岗。&lt;/p&gt;
&lt;p&gt;焊接现场应采取防护措施，保证焊接区不受恶劣天气影响，特别是气体保护焊时，焊接区域风速应小于2m/S，相对湿度不得大于90%。&lt;/p&gt;
&lt;p&gt;接头组对时，应保证玻口内外两侧的清洁要求，将坡口每侧10~20mm范围内的油、锈等污物清理干净，焊缝组对时，应保证内外侧平齐，严格控制错边量，严禁强行组对。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;钢管焊接工艺方法选择及坡口选择&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;焊接方法选择&lt;/p&gt;
&lt;p&gt;采用双面焊，外环缝采用手工焊。&lt;/p&gt;
&lt;p&gt;大口径碳钢管固定焊接时，把整圈环缝分成两个半圈，由两焊工对称同时施焊，当打底焊焊完后，内环缝与外环缝可同时施工，以提高进度。&lt;/p&gt;
&lt;p&gt;坡口的选择&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;管径&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;壁厚(t)&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;间隙(b)&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;钝边(p)&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;坡口角度α(度)&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;坡口型式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;＞800&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;t≥10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2.0～3.0&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1～1.5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;60±5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;d=1/3t&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;坡口的加工&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;预制管道的坡口采用自动刨边机加工。&lt;/p&gt;
&lt;p&gt;现场安装管道的坡口采用电动管道切割坡噪同加工。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;转动口焊接的操作要点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;管道采用转动焊接，操作简便，且能保证质量，所以在预制场大量使用，在施工现场应尽量提高预制装配程度，减少固定焊口。&lt;/p&gt;
&lt;p&gt;对口及点焊&lt;/p&gt;
&lt;p&gt;管子对口的间隙要遵照有关规范，同时，要坡口端面间不平齐度小于0.5mm，焊口拼装错口不得大于1mm，对口处的弯曲度不得大于1/400，点焊时，对于管径小的（DN≤70mm）只需在管子对称的两侧点上点焊定位。管径大的可点焊三点或更多的焊点定位。&lt;/p&gt;
&lt;p&gt;点焊焊固的尺寸应适宜，通常当管壁厚度小于或等于5mm时，则点焊焊固厚度约为5mm，点焊长度约为20~30mm，为便于接头熔透，点焊焊固的两个端都必须修成缓坡形。&lt;/p&gt;
&lt;p&gt;根部的焊接&lt;/p&gt;
&lt;p&gt;为了使根部容易焊透，运条范围应选择在立焊部位。操作手法采用直线形或稍加摆动的小月牙形。&lt;/p&gt;
&lt;p&gt;多层焊的其他各层焊接方法&lt;/p&gt;
&lt;p&gt;转动口的多层焊接，运条范围是选择在平焊部位，即焊条在垂直吣线两边15°~20°范围内运条，而焊条与垂直中心线成30°角。&lt;/p&gt;
&lt;p&gt;采用月牙形手法，压住电弧作横向摆动，这样，可得到整齐美观的焊缝 ，在施工现场宜选用斜立焊部位进行焊接。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;水平固定口焊接操作要点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对口要求及点焊：组对时，管子轴线必须找下，以免形成弯折的接头；同时考虑到焊缝冷却时会引起对口间隙的收缩，所以对较大直径的管子，有必要于焊接前使平焊部位的对口间隙大于仰焊部位。点焊基本上与转动焊相同。&lt;/p&gt;
&lt;p&gt;根部施焊：在施工现场，都是不带垫圈的V形坡口对接焊，焊接方法采用两半法焊接。&lt;/p&gt;
&lt;p&gt;施焊程序：仰焊→立焊→平焊，此法能保证铁水和熔渣很好地分离，透度比较容易控制。它是沿垂直中心线将管子截面分成相等的两半各进行仰、立、平三种位置的焊接。在仰焊及平焊处形成两个接头。&lt;/p&gt;
&lt;p&gt;首先，对正点焊焊口，在仰焊缝的坡口边上引弧至焊缝间隙内，用长弧烤热起焊处（时间3---5s）。预热以后，迅速压短电弧熔穿根部间隙施焊，在仰焊至斜仰焊位置运条时，必须保证半打穿状态；至斜立焊及平焊位置，可运用顶弧焊接。&lt;img src=&quot;media/image2.png&quot; alt=&quot;&quot; /&gt;{width=&amp;quot;1.2916666666666667in&amp;quot; height=&amp;quot;0.4027777777777778in&amp;quot;}为了便于仰焊及平焊接头，焊接前一半时，在仰焊位置的起焊点及平焊部位的终焊点都必须超过管子的半周（超载中心线约5~10mm）。为了使根部透度均匀，焊条的仰焊及斜仰位置时，尽可能不作或少作横向摆动，而在立焊及立焊位置时，可作幅度不大的反半月形横向摆动。当运条至点焊缝接头处，应减慢焊条的前移速度，以便熔穿接头处的根部间隙，使接头部部分能充分熔透。当运条至平焊部位时，必须填满深池后才熄弧。&lt;/p&gt;
&lt;p&gt;其他各层的焊接：其他各层也多分两半进行仰焊→立焊→平焊的施焊方法，必须注意以下几点：为了消除底层焊缝中存在的隐蔽缺陷，在其外层焊缝施焊时，应选用较大电流值，并适当控制运条，达到既不产生严重咬边又能熔化掉底层焊缝中隐蔽缺陷的目的。为了便焊缝成型美观，当焊接外部第二层焊道时，在仰焊部位运条速度要快，使形成厚度较薄，中部下凹的焊缝，平焊部位运条速度应该缓慢，使形成略为肥厚而中央稍有凸起的焊缝。当对口间隙不宽时，仰焊部位的起焊点可以选择在焊道中央；如果对口间隙很宽，则宜从坡口的一侧起焊。&lt;/p&gt;
&lt;p&gt;从焊道中央起焊时的接头方法&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;media/image3.png&quot; alt=&quot;&quot; /&gt;{width=&amp;quot;1.0277777777777777in&amp;quot; height=&amp;quot;1.0in&amp;quot;}起焊：在越过中线10~15mm处引弧预热，起焊时电弧不宜压短，需作直线运条，速度稍快，至中线（接头中心）处开始逐渐做横向摆动。&lt;/p&gt;
&lt;p&gt;接头：接头起焊时电弧较大，运条速度稍快，坡口两侧停留时间比焊缝中央为长，接头处的焊波应该薄些，避免形成焊瘤。&lt;/p&gt;
&lt;p&gt;从坡口一侧起焊时的接头方法&lt;/p&gt;
&lt;p&gt;起焊和接头的基本要求与上相似，只是起焊点在坡口的一侧，接头处的焊波是斜交的。&lt;/p&gt;
&lt;p&gt;垂直固定管的焊接操作要点：当对口两侧管径不等时（错口），可能将直径较小的管子置在下方，并且保证沿圆周方向的错口数值均等。为了使焊口对正，管子端面应垂直于管子轴线。焊接之前，坡口及其两侧10mm范围内应清除锈污，直至显露金属光泽为止。点焊及焊点的修理都与钢板横焊的点焊相似。当管径较小时（Φ≥70mm），只需管子对称的两侧点焊两噗就行。管子较大时，可点焊三点或更多的焊点。根部焊接，多层焊接操作同横焊相同。倾斜固定管的焊接操作要点这种管子的斜焊方式，可以说是水平固定管焊接和垂直固定管焊&lt;img src=&quot;media/image3.png&quot; alt=&quot;&quot; /&gt;{width=&amp;quot;0.9722222222222222in&amp;quot; height=&amp;quot;0.9444444444444444in&amp;quot;}接的结合，根部焊接与水平固定管焊接相似；多层焊时，若管子倾角小于45度时，就用垂直固定焊接的方法，当管子倾角大于45度时，也可用水平固定管焊接方法。此形式难以获得美观的外表，尤其是焊缝接头处。&lt;/p&gt;
&lt;p&gt;对口要求及点焊：与水平固定焊接相同。根部施焊：分成两半焊成，由于管子是倾斜的，熔化铁水有从坡度口上侧附落到下侧的趋向，所以在施焊中焊条应该偏于垂直位置。其余注意事项与水平固定管焊接相同。仰焊及平焊接头可以按以下方式施焊：&lt;/p&gt;
&lt;p&gt;仰焊接头。起焊点越过管子半周的1020mm，横向摆动的幅度自仰焊至立焊部位越来越小。在接近平焊处摆幅度增大。为了防止熔化铁水偏坠，折线运条方向也需随之改变。&lt;/p&gt;
&lt;p&gt;平焊接头。平焊接头比仰焊接头容易操作，为了防止咬边，应选用较小电流，焊条于坡口上侧停留时间略长。&lt;/p&gt;
&lt;h3&gt;（7）钢管混凝土浇筑&lt;/h3&gt;
&lt;p&gt;钢管混凝土的浇筑，采用立式手工浇捣法，振捣采用插人式加长振捣棒。混凝土强度等级根据招标文件要求制定。
钢管混凝土施工缝处理施工缝设置在距钢管上端口30cm处，每次浇混凝土前铺设20cm厚与混凝土等强的砂浆层，混凝土浇至管顶清除浮浆层至坚硬混凝土面加盖养护。
钢管混凝土泌水与空鼓现象的处理钢管的密闭性使混凝土中水分无法析出，加上振捣棒在狭小管内振捣，粗骨料相对下沉，砂浆上浮，使混凝土中多余水分上浮至管顶，在管顶形成砂浆层和泌水层。混凝土在硬化过程中的收缩，也易导致管壁与混凝土粘结不紧密，造成空鼓现象。针对以上问题，经对钢管混凝土施工的各个环节进行分析，采取如下措施：
严格控制碎石级配，钢管混凝土所有碎石必须是0.5～4cm连续级配。调整配合比，确定水灰比为0.4，坍落度为20mm。在混凝土中掺入12％UEA膨胀剂配制成补偿收缩混凝土，并掺入NF高效减水剂，增强混凝土的粘聚性与和易性，减小用水量。一次投料振捣高度不超过1.5m，用混凝土体积控制高度，振捣时间以混凝土表面无气泡泛出为准，设专人监控&lt;/p&gt;
&lt;h3&gt;（8）橡胶垫圈施工&lt;/h3&gt;
&lt;p&gt;安装混凝土管道对口安装：管道接口采用胶圈接口，铺设管道时严格控制管道轴线及高程偏差，轴线偏位控制在15mm以内，高程偏差控制在10mm以内；&lt;/p&gt;
&lt;h2&gt;5、管道检查井施工&lt;/h2&gt;
&lt;p&gt;（1）垫层测量定位&lt;/p&gt;
&lt;p&gt;进行中心线和位置的放线；做好标高测量工作：用水准仪把水准点标高根据实际已排设两端管底标高的要求，直接引测到基础位置。确保基础干燥时浇捣素砼垫层，按设计配比进行浇捣。&lt;/p&gt;
&lt;p&gt;（2）基础钢筋绑扎&lt;/p&gt;
&lt;p&gt;钢筋加工采用现场加工，在现场配置钢筋弯曲机、钢筋切断机、钢筋拉直机、钢筋对焊机。&lt;/p&gt;
&lt;p&gt;① 钢筋翻样根据设计图纸及国家规范标准进行翻样，填写加工单经复核后交钢筋加工场加工。&lt;/p&gt;
&lt;p&gt;② 钢筋加工的规格、尺寸、搭接、锚固长度，必须符合设计及规范要求。&lt;/p&gt;
&lt;p&gt;③ 钢筋绑扎施工严格按设计规范要求的钢筋排列间距顺序自下而上施工。钢筋保护层厚度、位置及标高要从严控制。&lt;/p&gt;
&lt;p&gt;④ 钢筋保护层厚度使用预制砂浆垫块控制。&lt;/p&gt;
&lt;p&gt;（3）砼浇筑&lt;/p&gt;
&lt;p&gt;砼的材料、拌和、运输、浇筑符合施工规范要求，要用机动翻斗车运到沟槽顶面，倒在铁皮上防止浸水，达到2.5Mpa后才可拆除模板。&lt;/p&gt;
&lt;h2&gt;6、闭水试验&lt;/h2&gt;
&lt;p&gt;严格按照《给排水管道工程施工及验收规范》(GB50268-97)进行闭水试验。做闭水试验时要遵循以下几条原则：&lt;/p&gt;
&lt;p&gt;管道接口连接完毕后就应进行单口水压试验；水压试验时应先排净水压腔内空气；试验压力为管道设计压力的2倍且不得小于0.2Mpa，保压2min，无明显压降为合格。若单口试压通不过且确定是接口漏水，则应马上拔出管节，找出原因，重新安装，直至符合要求为止。试压合格即进行下道工序施工。&lt;/p&gt;
&lt;p&gt;管道两端的管堵应封堵严密、牢固、下游管堵设置放水管和截门。&lt;/p&gt;
&lt;p&gt;管道两端的管堵如用砖砌时，必须养护达到一定强度后，再向管内注水。闭水试验应在管道灌满水24 小时后进行。对渗水量的测定时间不得少于30min。渗水量不超过规定的允许渗水量，才算合格。试验渗水量计算公式如下：&lt;/p&gt;
&lt;p&gt;Q=48q×1000/L&lt;/p&gt;
&lt;p&gt;Q------每km 管道每d 的渗水量&lt;/p&gt;
&lt;p&gt;q------闭水管道30 min 的渗水量&lt;/p&gt;
&lt;p&gt;L------闭水管长度&lt;/p&gt;
&lt;p&gt;项目经理部质量员要在班组做闭水试验的基础上会同建设单位、监理单位或质检站(至少三方)一起做管道闭水试验，这是一项必检的项目，而且要做到闭水一次成功，以半小时测试数据来推算。&lt;/p&gt;
&lt;p&gt;（5）土方回填&lt;/p&gt;
&lt;p&gt;管沟回填应在管道连接完成后马上进行，避免管沟侧面原土的滑移。&lt;/p&gt;
&lt;p&gt;在人工回填施工过程中，要认真捡出不应回填的有机物杂质、颗粒超出规定的石头、冻土及其他有害材料。管区应分层回填。每次回填厚度为30cm，回填材料按设计要求。当回填材料填到管道起拱线及其以上位置时，所有夯实都应从管沟侧壁开始，逐渐向管道靠近，以避免管道受到外来夯击载荷的作用。&lt;/p&gt;
&lt;h2&gt;7、双壁波纹管施工方案：&lt;/h2&gt;
&lt;p&gt;施工工艺：测量放线→机械开槽→槽底平整夯实→砂砾垫层→砂基→管道安装→井室砌筑、抹面→胸腔填土→庇水试验→回填土夯实
导线点、水准点加迷曝制及定位测量放线施工方案：
熟悉设计图纸、资料，弄清主管和支管的管线布置、走向及工艺流程和施工安装要求。熟悉现场情况，了解设计管线沿途已有的平面及高程控制点分布情况。根据管道平面和已有控制点，并拮和实际地形，做好实测数据整理，绘制实测草图。进场后对贱设单位交接的水准点和导线点进行复扳，庇和差符和设计要求后，进行导线点、水准点的加密，每60米范围内有一个水准点，加密点必须进行庇和平差水准点的庇和差为20√L，确保加密点的准确，以满足排水管高程、线型控制的精度。由于管道中踢桩在施工中要被挖掉，因此在不受施工干扰、施测方便、易于保护的地方测设施工控制桩，测设中踢方向控制桩，采用延长线或导线法，测设附属构筑物位置控制桩，采用交会法或平行踢法。施工过程中的测量主要是槽底高程的确定，机械开挖后，采用跟机测量，随挖随测，杜绝超挖现象，确保槽底高程符和设计要求，管道安装后，进行复扳，发现问题及时处理，使管底高程控制在允许偏差范围内。每天测量工作开始前，都要进行锑邻水准复核测量。
管道中心由中踢控制桩来确定，通过控制桩在管道基础上打出边线，确定管道的铺设位置。井室高程根据设计要求进行控制，管道铺设完毕后，要进行管顶及构筑物的竣工复核测量。
塑料
沟槽开挖及基础处理：
熟悉图纸，根据设计给定的水准点及坐标控制点进行测量、定位、放线，引临时水准点及控制桩，经监理工程师复核认证批准后方可进行沟槽开挖。工程采用挖掘机进行开挖，沟槽开挖要严格控制挖深及管道中朽，机械开挖留20cm的余量，由人工清槽至设计槽底高程位置，并将里程桩引至槽底。严格控制沟槽开挖放坡系数，按设计的放坡系数挖够宽度，开挖时应注意沟槽土质情况，必要时应请驻地监理和甲方及设计代表现场确定放坡系数，以防槽边塌方。沟槽开挖的土方直接装车外运，外运地点由业主指定。当沟槽开挖遇有地下水时，设置排水沟、集水坑，及时做好沟槽内地下水的排水降水工作，并采取先铺卵石或碎石层（厚度不小于100mm）的地基加固措施；当无地下水时，基础下素土夯实，压实系数大于0.95；当遇有淤泥、杂填土等软弱地基时，按管道处理要求采用极配戈壁土进行换填处理；换填厚度为30cm。
在沟槽开挖百米左右，土方外运人工清槽后，并经监理工程师检验和格，方可在沟槽内进行搪道工序的施工。
管道基础：
工程中管道基础采用20cm砂砾垫层基础，135°砂基础。管道基础采用粗砂；砂基基础施工时，槽底不得有积水、软泥；砂基厚度不得小于设计规定。管道安装由机械配和人工下管，设专人指挥吊车逐节吊装，吊装管道中朽的控制采用边线法。吊车距沟边至少2m，避免起吊受力时造成沟边坍塌。管道在安装前，对直径等进行检查。
管道安装采用人工安装，槽深度不大时可由人工扛管下槽，槽深大于3m或管径大于公称直径DN400时，可用非金属绳索溜管入槽，依次平稳地放在砂砾基础管位上。严禁用金属绳索勾住两端乖期或将管材自槽边翻抛入槽中。
稳管前，对基础设计高程和中踢位置进行检查，符和设计和规范要求后方可进行稳管，同时需做好管道安装的高程和中踢的测量定线工作。因管道接口为胶圈接口，故管道在顶进过程中，不得强行顶进，以防损坏乖期，顶进深度符和技术规范要求。有质量问题的管子严禁下槽，安装后的管内底高程符和规范要求。管道与检查井连接采用柔性连接。井&lt;/p&gt;
&lt;h2&gt;8、道路工程&lt;/h2&gt;
&lt;p&gt;施工流程图&lt;/p&gt;
&lt;p&gt;施工测量→路床整形→石碴基层→水泥稳定层→水泥混凝土面层。&lt;/p&gt;
&lt;p&gt;熟读设计文件和有关图纸，在施工前对设计提供的桩号、桩位进行实地校核和调查，对设计提供的控制点、水准点进行检查和复制，并进行全线贯通、恢复测量、因定路线和施工放样工作。测量标准应符合《市政道路工程质量检验评定标准》的要求。&lt;/p&gt;
&lt;p&gt;路床整形路基填筑，在路基填筑正式开工前5天，通知监理工程师对填筑断面的实地放样结构进行复核，经监理工程师批准后进行加填工作。路基填筑前做好基底处理工作。清除填筑范围内的树木、树桩草皮等杂物。所有块片石采用不易风化的大石块，尺寸一般不宜小于30cm。为防止填土沿地面滑动，当面横坡大于1∶1.5时，将原地面挖成台阶，台阶宽度不少于1m，高度最小为0.5m，且台阶顶面做成向内倾斜2-4%的坡度，然后从低到高分层填土压实，使填土与原表土密实稳定。填筑高度小于80cm的路段，在挖除表土后，应再翻松不小于25cm深，予以整平碾压，其压实度达到规定要求后再进行填筑。填筑高度低于20cm和挖方路段，翻松不小于30cm深，以整平碾压至规定压实度。路基填筑材料根据业主提供的资料对各取土场分层取样试验，根据试验数据做好合理调配使用不同土方的方案。路基填筑根据各路段填料来源情况采用水平分层，纵坡分断，以机械施工为主，人工为辅作业。填料必须符合规范要求。一般每层填压厚度为30cm以内，一层压好达到标准后，再填第二层。含水量控制在试验确定的最佳含水量范围或±1%以内。填筑路基时从原地面按全宽、逐层、逐段、逐类填料填筑。每层填铺设的宽度，应超过每层设计宽度每侧30cm，保证边坡修整的净宽度及完工后的路基边缘有足够的压实度。压实采用振动式压路机碾压，碾压遵循先慢后快、先边缘后中间、先低后高，有圆曲线段先弯道内侧后弯道外侧碾压，并注意至少有1/3的轮迹叠。并尽快压到规定的压实度（土）或固体体积率（岩渣）。不同性质的填料分别分层填筑，水稳性、冻稳性较好，透水性较小的土填在路基上部。相邻不同填料筑交接处做成斜面搭接，以利于路基强度的和缓过渡。注意路基排水工作，避免路基因填筑方法不当而产生不均匀沉陷形成弹簧土和滑动坡面。&lt;/p&gt;
&lt;p&gt;水泥稳定层施工：集中拌和→运送到现场→人工摊铺→压实→养护。&lt;/p&gt;
&lt;p&gt;操作工艺，根据试验室配合比，调整至施工配合比进行施工，施工时采用钢模、机械拌和、人工摊铺、机械碾压、人工养生，保证搅拌时间，使混合料搅拌均匀，按1.2的松铺系数摊铺，摊铺后要及时碾压，碾压时，在直线段上，压路机由两侧向路中心碾，在曲线段上，由内侧进行碾压，直到达到要求的压实度为止。&lt;/p&gt;
&lt;p&gt;水泥砼路面施工&lt;/p&gt;
&lt;p&gt;施工顺序为：在已建的基层上测量放样→立钢模→砼搅拌→砼运输→摊铺→振捣→抹平→养护→刻缝→保养，在整个施工过程中，着重抓好拌和、振捣、整平三个环节，以保证砼面的优良率。&lt;/p&gt;
&lt;p&gt;砼的搅拌：砂石料堆场的场地，采用硬地坪（混凝土地坪）堆场，以确保现场材料与试验室取样材料一致。砼的配合比，严格按照试验室提供的配料单、视现场材料含水率情况调整，并严格计量投料，施工现场设置电脑秤一台，350搅拌机一台，备用磅称一台，以便准确计量，拌制时一定要严格投料顺序，即砂，水泥，石子，搅拌时间不得少于90秒钟以及混凝土的颜色、稠度均匀一致为止。&lt;/p&gt;
&lt;p&gt;振捣：振捣采用插入式振动器振捣，然后用梁式平板振动器将表面拖平，再用长滚筒纵横滚压平整，后用真空吸水机进行吸水。&lt;/p&gt;
&lt;p&gt;整平：由熟练的抹灰工提浆刮平，刮平后用抹光机初抹，再用包裹铁皮的木槎杆或小钢轨对砼面进行拉锯式的搓刮、边纵向搓、搓杆刮后用三米直尺检验平整度，找补时应用原浆不得另拌砂浆禁止撒干水泥找补后用铁抹子抹光待稍干后压纹，浇筑后待砼强度达20-30%即可切割缩缝切割深度为板厚的1/4-1/3。&lt;/p&gt;
&lt;p&gt;接缝的施工:胀缝应与路面中线垂直，胀缝必须垂直，缝隙宽度必须一致，缝中不得连浆，缝传力杆的活动端设在后浇块的一边，固定后的传力杆必须平行于板面及路面中心线，其误差不得大于5mm，施工缝的位置尽量与胀缝相吻合，施工缝传力杆的一半锚固于砼中，另一半应涂沥青，便于滑动，传力杆必须与缝垂直。&lt;/p&gt;
&lt;p&gt;砼路面的保养:根据施工情况，计划用草袋浸湿后养护，养护期禁止车辆通行，在达到强度的80%后，方可允许小型车辆通行。&lt;/p&gt;
&lt;p&gt;沥青路面施工：&lt;/p&gt;
&lt;p&gt;注意事项：&lt;/p&gt;
&lt;p&gt;沥青砼面层施工前，应先处理好沥青砼面层与水泥混凝土面层接头处的砼补强段，待水泥砼达到强度后，再进行沥青砼面层施工。修筑试验段：沥青砼路面全面施工前，采用计划使用的机械设备和拌和料配合比铺筑试验路段，长度300m，通过试验路段的铺筑，在于准确控制拌和时间与拌和温度，铺筑温度与松铺厚度、速度等。压实机械的合理调配，压实温度与压实方法及路拱调整，松铺系数的测定，合适的施工长度，并且在试验段中，抽样检测各种沥青拌和料的沥青含量、矿料级配、稳定度、流值、空隙率、饱和度、密实度等，并且在沥青混合料压实12小时后，按标准方法进行压实度、厚度的抽验。通过试验路段的施工、试验检测，达到优化拌和、运输、摊铺、碾压等施工工序，确保机械的正常使用和工序衔接，准确控制各项工序质量，明确各岗位人员的职责，提出标准施工方法。&lt;/p&gt;
&lt;p&gt;混凝土路面施工工艺&lt;/p&gt;
&lt;p&gt;检查下承层 → 清理下承层 → 施工测量放样 → 厂拌沥青混合料 → 机械运输 → 拉基准线洒油 → 机械摊铺 → 机械碾压 → 检测压实度 → 养护 → 自检验收&lt;/p&gt;
&lt;p&gt;(1) 材料准备&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;粗集料&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;粗集料采用监理部门认可，具有生产许可证的采石场生产出来的碎石，碎石应洁净，干燥，无风化，无杂质，具有足够的强度，耐磨耗性。粗集料的粒径规格按招标文件技术规范&amp;quot;沥青面层用粗集料规格&amp;quot;选用，其质量应符合下表要求。&lt;/p&gt;
&lt;p&gt;粗集料应与沥青有良好的粘结能力，不低于4级，否则应用干燥的磨细石灰粉或水泥作为填料的一部分，其用量宜为矿粉总量的1%～2%，或加入合格外掺剂。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;细集料&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;细集料宜选用优质的天然砂或机制砂，当缺砂时，也可使用石屑，但应根据级配曲线确定砂、石屑的含量。有条件应尽量使用机制砂。细集料应洁净、干燥、无风化、无杂质，并由适当的颗粒组成，其规格应满足招标文件技术规范的要求。细集料的质量应符合下表要求。&lt;/p&gt;
&lt;p&gt;细集料应与沥青有良好的粘结力，不宜与沥青粘结能力很差的天然砂及花岗岩等酸性石料破碎的机制砂或石屑。当需要使用时，应采用经监理工程师批准的满足规定要求的磨细消石灰、水泥或抗剥离剂等抗剥离措施。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;填料&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;应采用石灰岩或岩浆岩中的强基性岩石等憎水性石料经磨细的矿粉，不应含有泥土杂质和团粒。矿粉要求干燥、洁净，经监理工程师同意采用水泥、石灰等作为填料时，其用量不宜超过集料总量的2%。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;沥青&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用的沥青（按照施工图设计的要求，沥青采用国产优质沥青）应为招标人要求的沥青，沥青要求质地均匀、无水，当加热到180℃时不起泡沫。&lt;/p&gt;
&lt;p&gt;供应商运到现场的沥青都应附有制造厂的证明和出厂实验报告，&lt;/p&gt;
&lt;p&gt;试验路段开工前5天，将拟用的沥青混合料级配、沥青结合料用量及沥青混合料稳定度、流值、空隙率、动稳定度、残留稳定度等各项技术指标方案提交监理工程师批准。各层沥青混合料的技术标准应符合《公路沥青路面施工技术规范》JTG F40-2004的规定。上面层的车辙试验动稳定度应不小于1200次/mm。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;沥青混凝土技术要求&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;混合料中的集料级配应符合技术规范的要求，沥青混合料的热稳定性和配合比设计应按照JTG 052-2000马歇尔稳定度试验方法来确定。稳定度试验至少应做5组（每组6个）试件测定其密度、稳定度、流值，并诸空隙率和饱和度。使沥青混合料的各项指标符合规范要求。沥青路面的上面层应通过车辙试验机进行抗车辙检验。&lt;/p&gt;
&lt;p&gt;当配合比被批准后，应进行试拌，经监理工程师批准后方可进行正式的混合料生产。&lt;/p&gt;
&lt;p&gt;本标段路面采用1台ABG---423型多功能沥青混凝土摊铺机进行面层摊铺施工，在进行正式摊铺前，应由特种机械工会同有关技术人员进行机械调试，确保施工过程中机械性能的正常性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;测量放样&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在下层上每10m（曲线段每5m）逐桩恢复中线桩，在中线桩对应法线上放出中、边桩，并在中边桩外侧50cm处设置导线桩。用水准仪测出中边桩下层顶面标高。根据下层顶面高程和每层设计高程以及试验段得出的松铺系数，确定松铺高度，设置摊铺机水平传感导线，导线采用2mm不锈钢丝，用张紧器张紧，张紧力不小于800N，架设长度不大于150m。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;沥青混合料拌和生产&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;沥青混合料的生产采用生产能力150t/h（LB3000）沥青拌和楼进行拌和，考虑到本段沥青混合料用量较大，因此要注意避免对所属地段造成环境污染，拌和场现场应注意采取有效的防污措施。&lt;/p&gt;
&lt;p&gt;沥青材料的准备，沥青材料应先加热，加热温度在150～170℃范围内，并应避免局部过热，保证按均匀温度把沥青材料源源不断地从贮料罐输送到拌和机内，且不应使用正在起泡或加热超过170℃的沥青。&lt;/p&gt;
&lt;p&gt;集料的准备，粗、细集料应分类堆放和供料，取自不同料源的集料应分开堆放。应对每个料源的材料进行抽样试验，并应经监理工程师批准。集料加热温度应比沥青加热温度高10～20℃，在被送进拌和设备时的含水量应不超过1%，烘干用的火焰应调节适当，以免烤坏或熏黑集料。填料不加热。&lt;/p&gt;
&lt;p&gt;拌和，集料、填料和沥青材料应按工地配合比规定的用量测定和送进拌和机内，并打印出每盘的称重数据。在拌和机内及出厂的混合料温度为145～165℃，并应保证运到施工现场的温度不低于145℃。&lt;/p&gt;
&lt;p&gt;拌和时间应能使矿质集料所有的颗粒都均匀地裹覆上沥青为度，每锅拌和时间以30～50s为宜，其中干拌时间不得少于5s，并经试拌确定。热拌沥青混合料面层（包括上面层、下面层）应在监理工程师监督下进行抽样试验，试验结果应符合技术规范的有关规定。&lt;/p&gt;
&lt;p&gt;所有过度加热的混合料（混合料出厂温度超过正常温度高限的30℃时），或已经炭化、起泡和含水的混合料都应废弃。拌和以后的混合料必须是均匀的，集料的所有颗粒都应涂上结合料，不得带有花白斑点、离析和结块现象。在材料的规格或配合比发生改变时，都应根据室内试验资料进行试拌，试拌时必须抽样检查混合料的沥青含量、级配组成和有关力学性能、并报请监理工程师批准。&lt;/p&gt;
&lt;p&gt;沥青混和料应贮于保温贮料仓。贮料仓应能避免局部过热，并使离析现象减少到最低程度。&lt;/p&gt;
&lt;p&gt;对所有过度加热的混合料，或已经碳化、起泡和含水的混合料都应废弃；对带有花白斑点、离析和结块的混合料亦应废弃；当沥青混合料或温度超过195℃时，应予以废弃。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;工作面的准备&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;工作面应干燥、清洁，无任何松散物质、灰尘与杂质。当要求清扫时，应使用机帚作业，工作宽度应延伸至打算摊铺沥青混合料边缘外30cm，路面上粘附的不能用机帚清除的杂质，应采用其它方法清除。被油类污染面积较大的地方，应采用批准的方法清除。&lt;/p&gt;
&lt;p&gt;若清除之后工作面松软，则应进纠正，挖除松软部分，以同样材料填补到规定的密实度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;沥青混合料运输&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;沥青混合料在运输时，应采用吨位较大的自卸汽车运输，车厢应清扫干净。为防止沥青与车厢板黏结，车厢侧板和底板应涂上一薄层油水混合液（柴油与水比例为1：3），不得有余液积聚在车厢底部。同时为了保证摊铺温度，运输时必须采取加盖毡布的措施进行保温，运到现场混合料温度应不低于145℃。已经离析或结成块不能压碎的硬壳、团块或在运料卸料时留于车上的混合料或被雨水淋湿的混合料，都应废弃。为保证连续摊铺，现场等待卸料车辆不得少于5辆，摊铺机前方也至少有3辆运料车在等候卸料。连续摊铺中，运料车应在摊铺机前10-30cm处停留，不得撞击摊铺车，卸料过程中运料车应挂空档，靠摊铺机推动前进。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;沥青混合料摊铺&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;摊铺混合料前，必须对路面的下层进行检查并取得监理工程师的批准。各层应连续施工，否则，对下面层表面的所有松散材料都应清扫，直到表面无污物为止。铺筑面层前，应洒粘层沥青并取得监理工程师的批准。对清扫过及洒过粘层沥青的表面，不许车辆行驶。路缘石及其它结构物应在铺筑前完成，摊铺前应在所有接触面上均匀地刷上一薄层热沥青结合料，涂刷时不得污染周围的非涂刷区。运料应尽快地不间断地卸进摊铺机，并立刻进行摊铺，不得延误。向摊铺机输送材料的速率应与摊铺机连续不断工作的吞吐能力相一致，并应尽一切可能使摊铺机连续作业。如果发生暂时性断料，则摊铺机尚应继续保持运转。摊铺机的行驶速度和方法应及时调整，以保证混合料平整而均匀地铺在整个摊铺宽度上，不产生拖痕、断层和离析。应采用梯队交错排列方式连续摊铺，前后摊铺机的轨道应重叠5～10cm，相邻摊铺机宜相距10～30cm，且不得造成前面摊铺的混合料冷却。沥青混合料的松铺系数应采用试验段测出的数据进行摊铺。摊铺机自动找平时，下面层应用用钢丝引导的高程控制方式，上面层应全部采用浮动基准梁来控制。经摊铺机初步压实的摊铺层应符合平整度、横坡的规定要求。沥青混合料的摊铺温度应控制以不低于135℃范围内，低温施工时，为不低于150℃。对外形不规则、路面厚度不同、空间受到限制以及桥梁伸缩缝等摊铺机无法工作的地方，经监理工作师批准可以采用人工铺筑混合料。在雨天或表面存有积水及平均气温低于10℃时，都不得摊铺混合料。当气温下降到15℃以下时，应注意控制混合料的最大运距，以保证碾压温度在规定的范围内。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;沥青混合料压实&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在混合料完成摊铺和刮平后立即进行检查，对不规则处及时人工调整，随后进行充分、均匀的压实。压实工作应按试验路面确定的压实设备和组合程序进行，对于狭窄地点的压实与修补工作，可利用经监理工程师认可的小型振动压路机或手扶振动夯具以及人工热夯等方式。压实分初压、复压和终压。压路机应以均匀速度行驶。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;碾压：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;压实分初压、复压和终压三个阶段：&lt;/p&gt;
&lt;p&gt;初压采用追随式碾压，即紧跟摊铺机均匀行驶。2台双钢轮搌动压路机按同一方向循环碾压。初压时应给钢轮洒水，洒水易以不粘轮为准，光轮后退停机返向的位置尽可能要退到复压基本完成的位置，不在初压表面停机返向，以免增加较深的停机痕迹。初压后应检查平整度和路基，必要时应予适当的修整。&lt;/p&gt;
&lt;p&gt;复压采用胶轮压路机进行碾压。胶轮压路机一般不洒水，但必须保证胶轮的清洁。复压完成后混合料表面应达到沥青脂上浮，表面必亮和胶轮作用下沥青料基本不蠕动的效果。&lt;/p&gt;
&lt;p&gt;终压采用双钢轮压路机进行碾压，其目的是消除各种施工痕迹，碾压遍数以无痕迹为原则。&lt;/p&gt;
&lt;p&gt;碾压作业应在混合料处于能获得最大密实度的温度下进行，碾压温度应控制在130℃，低温施工时为145℃。&lt;/p&gt;
&lt;p&gt;碾压应纵向进行，并由材料摊铺的低边向高边慢速均匀地进行。相邻碾压至少重叠宽度为：双轮30cm，三轮为后轮宽度的1/2。&lt;/p&gt;
&lt;p&gt;碾压期间，压路机不得中途停留、转向或制动，当压路机来回交替碾压时，前后两次停留地点应相距10cm以上，并应驶出压实起始线3m以外。&lt;/p&gt;
&lt;p&gt;压路机不得停留在温度高于70℃的已经压过的混合料上，同时应采取有效措施，防止油料、润滑脂、汽油或其它有机杂质在压路机操作或停放期间掉落在路面上。&lt;/p&gt;
&lt;p&gt;在压实时，如接缝处的混合料温度已不满足压实温度要求时，应采用加热器提高混合料的温度达到压实温度，再压实到无缝迹为止。否则必须垂直切割混合料并重新铺筑，立即共同碾压至无缝迹为止。&lt;/p&gt;
&lt;p&gt;已经碾压的路面不得修补表皮。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;接缝&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;摊铺机工作的安排应使纵、横向两种接缝都保持在最小数量。接缝的方法及设备，应取得监理工程师的批准。在接缝处的密度和表面修饰应与其它部分相同。纵向接缝应是热接缝，并应是连续和平行的，缝边应垂直并形成直线。在纵缝上的混合料，应在摊铺机的后面立即用一台静力钢轮压路机以静力进行碾压。碾压工作应连续进行直至接缝平顺而密实。纵向接缝应设置在通行车辆轮辙之处，与横坡变坡线重合应在15cm以内，与下卧层接缝的错位至少应为15cm。当由于工作中断，摊铺材料的末端已冷却，或第二天方恢复工作时，应做成一道横缝。横缝应与铺筑方向大致成直角，横缝在相邻的层次和相邻的行程间均应至少错开1m。横缝应有一条垂直经碾压良好的边缘。当加铺沥青混凝土路面与原有路面连接并配合标高时，应将原有路面数据与现有数据核实无误，以保证达到图纸规定的新铺路面最小层厚。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;开放交通&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;应在沥青混合料路面外型完全冷却并经监理工程师书面同意方可开放交通。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;压实质量控制&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;碾压温度&lt;/p&gt;
&lt;p&gt;在摊铺完毕后及时碾压，一般来说，压路机尽可能靠近摊铺机进行碾压。达到要求的压实度后，再以最少的碾压遍数进行表面修整，这时压路机可离摊铺机远一点。压实质量与压实温度有直接关系，而摊铺后混合料温度是在不断变化的，特别是摊铺后5～15min，温度损失最大（约3℃/ min），因此必须掌握好有效压实时间，适时碾压。&lt;/p&gt;
&lt;p&gt;应用合理的压实速度与遍数&lt;/p&gt;
&lt;p&gt;速度过低，会使摊铺与压实工序间断，影响压实质量，需要增加压实遍数来提高压实度，压实速度过快，混合料会产生推移、横向裂纹等。选择碾压速度的基本原则是：在保证沥青混合料碾压质量的前提下，最大限度地提高碾压速度，从而减少碾压遍数，提高工作效率，加快施工进度。&lt;/p&gt;
&lt;p&gt;应用合理的振频和振幅&lt;/p&gt;
&lt;p&gt;振频主要影响面层的表面压实质量，振幅主要影响面层的压实深度，实践表明，振频应在42～50HZ、振幅在0.4～0.8mm内进行选择。当碾压层较薄时，选取较低振频和较大振幅。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;质量保证措施&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;施工前组织全体施工人员认真学习合同文件和技术条款，熟悉设计图纸和施工方案，进行技术交底，使每个施工员作到心中有数。项目经理部设质检工程师，施工队设质检员，质检员对每道工序必须跟踪检查，同时成立由质检工程师为首的自检小组进行自检合格后方可请监理工程师检查，当监理工程师检查合格后，才能进行下一道工序的施工。在工作中，质检员和自检小组必须绝对服从监理工程师的监督。&lt;/p&gt;
&lt;p&gt;为确保工程施工质量，项目经理部自检频率严格按最新的《公路工程质量检验评定标准》规定执行。加强测量放样工作，搞好导线、中线和水准点的复测，对每一层整平和压实后分别准确的测出标高，计算松铺系数。底基层压实要求依次完成，每一层压实后表面必须&amp;quot;平整密实，无坑洼、无明显离析，施工接茬平整、稳定&amp;quot;，为此，在施工中我们将配备专门的维修人员和足够的机械配件，确保施工机械的连续运行。&lt;/p&gt;
&lt;h2&gt;9、化粪池工程&lt;/h2&gt;
&lt;p&gt;化粪池工程施工方案
（1）施工工艺顺序：
化粪池基坑土方开挖→基坑土体护坡加固→基坑降水→基坑底部清槽→铺垫层下卵石或碎石层→混凝土垫层→砌筑池壁红砖→化粪池顶盖及圈梁支模、绑筋、浇注混凝土→化粪池顶盖预制板制作→化粪池顶盖拆模→抹化粪池内壁、外壁防水砂浆，化粪池外壁涂热沥青→作化粪池24H 灌水实验→土方回填→化粪池预制顶盖安装。
（2）土方工程施工措施
土方开挖采取机械大开挖，由于地下水位和土质情况，开挖土体放坡系数选用1：1.5，土方开挖过程中，严禁在基坑四周堆土，开挖多余土方外运，土方开挖至设计标高后，于基坑一角设置集水坑一处，并于基坑四周设置集水道，将地下水汇集于集水坑内，设置一台潜水泵昼夜抽水，设一专人昼夜看护。为防止遇雨季天气，基坑开挖完成后，立即清理基槽，验槽完毕后，立即将垫层底部卵石或碎石层施工完成，浇注混凝土垫层。
（3）砌体工程施工措施&lt;/p&gt;
&lt;p&gt;砌筑砂浆采用强力灰粉代替石灰膏，中砂含泥量不大于3%。所用砂浆要随用随拌，砂浆稠度为70-100MM,并要在3-4 小时内用完，砂浆所用砂、水泥变动时，要及时调整配比。&lt;/p&gt;
&lt;p&gt;砂浆拌和采用重量比，配料误差在±2%以内，用搅拌机拌和，先在搅拌机内注入适量的水，再按配比依次投入水泥、砂、水。搅拌时间自投料完毕算起，不得小于120 秒钟。&lt;/p&gt;
&lt;p&gt;砌砖前一天，应把砖浇水湿润，严禁干砖上墙，吸水深度控制在15MM 以上，防止湿润不均或过湿现象。&lt;/p&gt;
&lt;p&gt;砖砌体要上下错缝，内外搭砌，组砌方式为一顺一丁，砌筑时采用&amp;quot;三一&amp;quot;砌砖法，杜绝缩口灰和板凳灰，水平灰缝的砂浆要饱满，饱满度不低于80%竖向灰缝采用挤浆或加浆方法，不得出现透亮灰缝，水平灰缝厚度控制在10±2MM。落地灰在初凝前回收，重新搅入新砂浆中使用。&lt;/p&gt;
&lt;p&gt;砌第一皮砖前，当基础混凝土表面高低差大于20MM 时应把上表面用C20 细石砼找平，找平后再砌，砌砖完后用笤帚扫净墙缝。&lt;/p&gt;
&lt;p&gt;砌砖前应先立好皮数杆，撂摆底砖，防止游丁走缝。皮数杆立在墙的大角处，内外墙交接处，纵墙皮数杆间距不大于12M。&lt;/p&gt;
&lt;p&gt;撂底砖经检查合适后，挂通线，砌底砖时，应跟线，双面挂线，撂底砖后进行盘角，盘角每次不宜超过5 皮高，并用靠尺，线坠，水平尺找平找垂直，每皮砖的高度对准皮数杆，按盘好的墙角为准，挂线砌砖。&lt;/p&gt;
&lt;p&gt;砌筑过程中，应经常检查并做到：&lt;/p&gt;
&lt;p&gt;墙大角和墙面垂直准确。五皮一吊线，三皮一靠尺。&lt;/p&gt;
&lt;p&gt;砌筑过程中，必须丁砖压顶，沿墙面每隔一定间隔的竖缝处，弹出墨线，墨线用经纬仪或线锤引测，砌一步架，上引一次，控制游丁走缝。
（4）钢筋工程施工措施&lt;/p&gt;
&lt;p&gt;材料要求&lt;/p&gt;
&lt;p&gt;钢筋出厂合格证和复试试验报告结论均要符合设计和规范要求。
成型钢筋、20～22 号火烧丝、水泥砂浆垫块(或塑料卡)。&lt;/p&gt;
&lt;p&gt;主要机具
钢筋钩子、小撬棍、钢筋板子、绑扎架、钢丝刷、运钢筋手推车、粉笔、脚手架、工作台等。
作业条件&lt;/p&gt;
&lt;p&gt;按施工平面图规定的位置平整好场地，按不同规格型号垫好堆放。&lt;/p&gt;
&lt;p&gt;进场钢筋应对照设计图纸和配料单，详细核对其型号、尺寸、数量、钢号、对焊的接焊质量。弹好标高水平线及墙的外皮线。圈梁及板缝模板已做完预检记录，并将模内杂物清理干净。&lt;/p&gt;
&lt;p&gt;操作工艺&lt;/p&gt;
&lt;p&gt;支完圈梁模板后，即可绑扎圈梁钢筋，如果采用预制绑扎骨架时，可将骨架按编号吊装就位进行组装。如在模内绑扎时，按设计图纸要求间距，在模板侧绑画箍筋位置，放箍筋后穿受力钢筋，绑扎箍筋。注意箍筋必须垂直受力钢筋，箍筋搭接处应沿受力钢筋互相错开。圈梁钢筋的搭接长度：因混凝土为C20 等级，I 级钢筋搭接长度不少于30d，Ⅱ级钢筋不少于40d（d 为受力筋直径）。受力钢筋接头的位置应相互错开，绑扎接头时在规定的搭接长度任一区段内（焊接接头时在焊接接头处的35d 且不小于500 毫米区段内），有接头的受力钢筋截面面积占受力钢筋总截面面积的百分率受拉区不大于25%，受压区不大于50%。圈梁钢筋绑扎时应互相交圈，在内外墙交接处，大角转角处的锚固长度均要符合设计要求。圈梁钢筋绑完后应加水泥砂浆垫块。&lt;/p&gt;
&lt;p&gt;钢筋工程单项工程质量验收&lt;/p&gt;
&lt;p&gt;保证项目：
钢筋的品种和质量必须符合设计要求和有关标准规定。进口钢筋焊接前必须进行化学成分检验和焊接试验，符合有关规定后方可焊接。检查钢筋出厂质量证明书和试验报告。
钢筋表面应保持清洁。带有颗粒状或片状老锈，经除锈后仍有麻点的钢筋严禁按原规格使用。
钢筋对焊或电焊焊接接头：按规定取试件，其机械性能试验结果必须符合钢筋焊接及验收的专门规定。
基本项目：
钢筋的绑扎、缺扣、松扣的数量不超过绑扣数的10%，且不应集中。
弯钩的朝向正确。绑扎接头应符合施工规范的规定，其中搭接长度均不少于规定值。
用I 级钢筋或冷拔低碳钢丝制作的箍筋，其数量、弯钩角度和平直长度均应符合设计要求和施工规范的规定。
对焊接头无横向裂纹和烧伤，焊包均匀，接头处弯折不大于4 度，轴线位移不大于0.1d且不大于2mm。电弧焊接头、焊缝表面平整，无凹陷、焊瘤、接头处无裂纹、气孔、夹渣及咬边。接头处不大于4 度，轴线位移不大于0.1d，且不大于3 mm，焊接厚不大于0.05d，宽不小于0.1d，长不小于0.5d。&lt;/p&gt;
&lt;p&gt;（5）模板工程施工
本工程模板采用十一胶合木模板和组合钢模板配合使用。
材料设备要求
木板（厚度为20～50mm），定型组合钢模板（长度为600、750、900、1200、1500mm）（宽度为100、150、200、250、300mm），阴、阳角模，连结角模。方木、木楔、支撑（木或钢），定型组合钢模板的附件（U 型卡、L 型插销、3型扣件、碟型扣件、对拉螺栓、钩头螺栓、紧固螺栓），铅丝（12～14 号），隔离剂等。&lt;/p&gt;
&lt;p&gt;作业条件&lt;/p&gt;
&lt;p&gt;弹好墙身＋50cm 水平线，检查砖墙的位置是否符线。办理预检手续。钢筋绑扎完毕，并办好隐检手续，模板拉杆如需螺栓穿墙，砌砖时应按要求预留螺栓孔洞。检查模板内的灰浆，将灰浆清理干净。&lt;/p&gt;
&lt;p&gt;操作工艺
工艺流程：作清理准备工作→支圈梁模板→ 支板模板→ 办预检支模前将圈梁及板缝处杂物全部清理干净。圈梁模板可采用木模板或定型组合钢模板上口弹线找平，圈梁模板采用落地支撑时，下面应垫方木，当用木方支撑时下面用木楔楔紧。用钢管支撑时高度调整合适。钢筋绑扎完以后，模板上口宽度进行校正定位，并用木撑进行校正定位，用铁钉临时固定。如采用组合钢模板，上口应用卡具卡牢，保证圈梁的尺寸。外墙圈梁，用横带扁担穿墙平面位置距墙两端24cm 开始留洞，中间每隔50cm 左右留一道，每面墙不宜少于5 个洞。&lt;/p&gt;
&lt;p&gt;模板工程质量验收&lt;/p&gt;
&lt;p&gt;保证项目：
模板及其支架必须具有足够的强度，刚度和稳定性，其支撑部分应有足够的支撑面积，如安装在基土上，基土必须坚实，并有排水措施。对湿陷性黄土，必须有防水措施；对冻胀性土，必须有防冻融措施。
基本项目：
模板接缝处应严密，预埋件应安置牢固，缝隙不应超过1.5mm。
模板与混凝土的接触面应清理干净并采取防止粘结措施，粘浆和漏刷隔离剂累计面积应不大于400cm2．如模板涂刷隔离时应涂刷均匀，不得漏刷或沾污钢筋。支模板时应在外墙面采取加固措施。圈梁模板外胀：圈梁模板支撑没卡紧，支撑不牢固，模板上口拉杆碰坏或没钉牢固。浇筑混凝土时没专人修理模板。混凝土流坠：模板板缝过大没有用纤维板、木板条等贴牢；外墙圈梁没有先支模板后浇筑圈梁混凝土，而是包砖代替支模板再浇筑混凝土，致使水泥浆顺砖缝流坠。
（6）砼工程施工措施&lt;/p&gt;
&lt;p&gt;所用水泥必须有质量证明书并应对其品种标号及日期检查验收，做好化学试验分析，要求各项指标必须合格，时间超过三个月或发现受潮，结块时必须做试验，按试验数据确定水泥标号。所用砂要用中、粗砂，含泥量要少，所用碎石级配良好，不含杂质，石子最大粒径不超过结构截面尺寸的1/4 和钢筋最小净距的1/4，对砼实心板可与40--50MM 粒径的碎石拌和，水采用自来水。
砼全部采用商品混凝土。砼拌好后，采用混凝土运输车运至浇灌地点，若发现砼离析，应进行二次搅拌，均匀后方准入模。在浇灌前，先清除干净模板，做好钢筋的隐蔽验收。在浇筑构造柱时，按400MM分层浇筑，并使用吊筒下灰，构造柱浇筑前，应在柱根处先浇50 MM 厚高标号砂浆再浇灌砼，砼振动要防止振动预埋件、钢筋，应快插慢拔，振捣时间为30 秒，以表面泛浆为准。砼浇灌过程中，不得踩倒和压弯钢筋，特别是负弯距钢筋，楼板砼用振捣棒振完后，再用平板器缓慢地来回拖一遍，并把表面用木抹子抹平。砼浇灌完毕24 小时后，待砼表面收水后，浇水保持湿润，一天3 次，养护时间不得小于7 天。
（7）抹灰工程施工措&lt;/p&gt;
&lt;p&gt;操作工艺
工艺流程：墙面清理粉尘、污垢→浇水湿润墙面→吊垂直找方抹灰饼冲筋、找规矩→抹底灰→抹面层防水砂浆。
基层处理：将墙面上残余砂浆、污垢、灰尘等，清理干净，并用水浇墙，将砖缝中的尘土冲掉，并将墙面湿润。吊垂直、套方、找规矩、抹灰饼同上。冲筋，抹底层砂浆时，用大横竖刮平，木抹子搓毛，终凝后浇水养护。
抹灰工程质量验收&lt;/p&gt;
&lt;p&gt;保证项目：
所用的材料品种，质量必须符合设计要求，各抹灰层之间，及抹灰层与基体之间必须粘结牢固、无脱层、空鼓、面层无爆灰和裂缝（风裂除外）等缺陷。&lt;/p&gt;
&lt;p&gt;成品保护，各抹灰层在凝结前应防止快干、曝洒、水冲、撞击和振动，以保证其灰层有足够的强度。&lt;/p&gt;
&lt;p&gt;注意事项
空鼓、开裂和烂根:由于抹灰前对基层清理不干净或不彻底，抹灰前不浇水，每层灰抹得过厚，跟得太紧；对于预制混凝土光滑表面不认真进行&amp;quot;毛化处理&amp;quot;；甚至混凝土表面的酥皮不处理就抹灰；抹灰后不养护。为解决好空鼓、开裂等质量问题，应从三方面下手解决，第一施工前的浇水、清理；第二施工操作分层分遍压实认真不马虎；第三施工后及时浇水养护，并注意施工地点的洁净，抹面层应一次到底。
（8）回填土工程施工措施&lt;/p&gt;
&lt;p&gt;施工准备&lt;/p&gt;
&lt;p&gt;材料及主要机具：
碎石类土、砂土（使用细砂、粉砂时应取得设计单位同意）和爆破石碴，可用作表层以下填料。它最大粒径不得超过每层铺填厚度的2/3 或3/4（使用振动碾时），含水率应符合规定。粘性土应检验其含水率，必须达到设计控制范围，方可使用。盐渍土一般不可使用。但填料中不含有盐晶、盐块或含盐植物的根茎，并符合《土方与爆破工程施工及验收规范》的规定的盐渍土则可以使用。
装运土方机械有：挖掘机、装载机、自卸汽车、翻斗车等。碾压机械有：平碾、羊足碾和振动碾等。
一般机具有：蛙式或柴油打夯机、手推车、铁锹（平头或尖头）、2m 钢尺、20 号铅丝、胶皮管等。&lt;/p&gt;
&lt;p&gt;作业条件：
施工前应根据工程特点、填方土料种类、密实度要求、施工条件等，合理地确定填方土料含水量控制范围、虚铺厚度和压实遍数等参数；
填土前应对填方基底和已完工程进行检查和中间验收，合格后要作好隐蔽检查和验收手续。
施工前，应做好水平高程标志布置。基坑或沟边上每隔1m 钉上水平桩橛或在邻近的固定建筑物上抄上标准高程点。
确定好土方机械、车辆的行走路线，应事先经过检查，必要时要进行加固加宽等准备工作。同时要编好施工方案。&lt;/p&gt;
&lt;p&gt;操作工艺
工艺流程：
基坑底地坪上清理→ 检验土质→ 分层铺土→ 分层碾压密实→ 检验密实度→修整、找平验收，填土前，应将基土上的洞穴或基底表面上的树根、垃圾等杂物都处理完毕，清除干净。检验土质，检验回填土料的种类、粒径，有无杂物，是否符合规定，以及土料的含水量是否在控制范围内；如含水量偏高，可采用翻松、晾晒或均匀掺入干土等措施；如遇填料含水量偏低，可采用预先洒水润湿等措施。填土应分层铺摊，每层铺土的厚度应根据土质、密实度要求和机具性能确定。碾压时，轮（夯）迹应相互搭接，防止漏压或漏夯。长宽比较大时，填土应分段进行。每层接缝处应作成斜坡形，碾迹重叠。重叠0.5～l.0m 左右，上下层错缝距离不应小于1m。
填方超出基底表面时，应保证边缘部位的压实质量。在机械施工碾压不到的填土部位，应配合人工推土填充，用蛙式或柴油打夯机分层夯打密实。回填土方每层压实后，应按规范规定进行环刀取样，测出干土的质量密度，达到要求后，再进行上一层的铺土。填方全部完成后，表面应进行拉线找平，凡超过标准高程的地方，及时依线铲平；凡低于标准高程的地方，应补土找平夯实。&lt;/p&gt;
&lt;h1&gt;七、针对该工程的建议及该工程技术保障措施&lt;/h1&gt;
&lt;p&gt;（1）沟槽每20m设一座下人爬梯，爬梯用钢脚手杆搭设。&lt;/p&gt;
&lt;p&gt;（2）所有参加施工的作业人员必须经安全检查技术操作培训合格。操作人员有权拒绝执行违反安全规定的指令，严禁洒后作业。&lt;/p&gt;
&lt;p&gt;（3）特殊工种（电工、电焊工等）必须经培训考试合格后持证上岗。&lt;/p&gt;
&lt;p&gt;（4）各工种工序施工前须由施工负责人进行技术交底，并签字。&lt;/p&gt;
&lt;p&gt;（5）设专职安全员，建立定期安全检查制度、检查有记录，对查出的隐患及时整改，对严重情况有权停止施工并立即向项目经理汇报，并要求停工。&lt;/p&gt;
&lt;p&gt;（6）施工场地内外及场内电缆保护区未征得有关部门同意严禁开挖等，地下作业加强对场内电缆保护。&lt;/p&gt;
&lt;p&gt;（7）基坑四周未回填前设防护栏杆。&lt;/p&gt;
&lt;p&gt;（8）入现场的施工人员必须遵守各项规章制度且听从安监人员的指挥。&lt;/p&gt;
&lt;p&gt;（9）施工人员进入现场必须正确配戴安全帽，空中作业必须系好安全带并且把安全带系在高处牢固的脚手架或其它物体上。&lt;/p&gt;
&lt;p&gt;（10）本工程所用的电器设备一律由专业的电工负责接线、检修，所使用的电器设备应有良好的接地且应将电源线接在漏电保护器下。&lt;/p&gt;
&lt;p&gt;（11）电焊工使用电器工具时应戴好绝缘手套，穿好绝缘靴，移动电线时严禁生拉硬拽。&lt;/p&gt;
&lt;p&gt;（12）在进行土方开挖时必须按规定进行放坡，防止土方坍塌，在安装管道时，沟槽上方应设有安全监护人，对沟槽两侧的土方动势进行观察，发现有裂纹或有土方塌方的迹象时及时通知沟槽内施工人员好撤离现场，待处理完毕确认安全以后方可继续施工。进入施工现场的人员必须进行三级安全教育，并经安全考试合格方可参加施工。&lt;/p&gt;
&lt;p&gt;（13）为了确保工程质量，在进行管道安装焊接时应严格执行现行国家施工及验收规范的规定进行施工及工程验收，且应严格执行三级检查验收制度。做好施工记录。及隐蔽工程验收记录。&lt;/p&gt;
&lt;p&gt;（14）参加施工的人员应经体检，高血压、心脏病等病症的人员不得参加施工。&lt;/p&gt;
&lt;p&gt;（15）参加现场施工的人员不得酗酒、打架斗殴、不得在现场吸烟、乱扔杂物。&lt;/p&gt;
&lt;p&gt;（16）工人进入施工现场衣着应整齐且统一穿好工作服，正确佩带胸卡。&lt;/p&gt;
&lt;p&gt;（17）安全防护：挖完土方的沟道上方四周应安放安全围栏，夜间应设警戒灯。&lt;/p&gt;
&lt;p&gt;（18）工人进入施工现场衣着应整齐且统一穿好工作服，正确佩带胸卡。&lt;/p&gt;
&lt;p&gt;（19）工程所需的周转工具、材料等应有计划有步骤地进入现场，剩余材料及时返回，凡已进入现场的材料、周转工具等分明类地摆放整齐，并每一项都挂好标识牌，做到有条不紊。&lt;/p&gt;
&lt;p&gt;（20）每天清理现场一次，做到工完料净场地清，工地上杜绝十头。&lt;/p&gt;
&lt;p&gt;（21）其他未尽事宜严格按照有关安全规范的规定。&lt;/p&gt;
&lt;h1&gt;八、确保工程质量的技术组织措施&lt;/h1&gt;
&lt;h2&gt;1、质量目标&lt;/h2&gt;
&lt;p&gt;本工程质量管理的目标：达到甲方要求的合格工程质量标准。&lt;/p&gt;
&lt;h2&gt;2、质量控制原则&lt;/h2&gt;
&lt;p&gt;为确保按质按量完成工程承包合同及施工图纸所规定的全部任务，必须依据国家、省、市的施工规范、规程、规定以及工程项目施工图特有的要求，进行全过程的施工质量控制。&lt;img src=&quot;media/image4.png&quot; alt=&quot;&quot; /&gt;{width=&amp;quot;1.5277777777777777in&amp;quot; height=&amp;quot;0.2222222222222222in&amp;quot;}我们的质量方针是&amp;quot;坚持质量第一，塑造精品工程，实现持续改进，确保顾客满意&amp;quot;。&lt;/p&gt;
&lt;p&gt;(1) 管沟、检查井、管道口等排水设施的位置、断面、尺寸、坡度、标高及使用材料严格遵照设计图纸要求。
(2) 管沟线型美观，直线线形顺直，曲线圆滑。
(3) 砌体砂浆配比正确，砌筑紧密，嵌缝饱满、密实，勾缝平顺无剥落，缝宽一致。
(4) 沟槽开挖后即时平整夯拍密实，如土质干燥须洒水湿润，遇有空洞陷穴，应堵塞夯实。水泥砂浆随拌随用，砌筑完后注意养护，砌筑过程中随时注意沟底沟壁的平整坚实，砂浆要饱满，无空隙松动。&lt;/p&gt;
&lt;h2&gt;3、主要人员职责&lt;/h2&gt;
&lt;h3&gt;（1）项目经理及项目班组成员职责&lt;/h3&gt;
&lt;p&gt;项目经理对项目施工质量负全面责任，是工程质量第一责任人。 坚持&amp;quot;百年大计，质量第一&amp;quot;的思想，主持工程的质量策划，实现质量管理目标。根据质量计划，结合工程实际，建立健全组织机构落实质量责任制。支持质量检验人员的工作，主持召开QC 小组成果发布会。&lt;/p&gt;
&lt;p&gt;认真贯彻公司的质量方针和质量目标，组织实施具体措施。深入工地调查研究，及时推广保证工程质量的先进施工方法，表彰奖励质量管理先进集体和个人。 合理安排施工生产，定期组织质量检查，认真评审工程质量。&lt;/p&gt;
&lt;p&gt;主持编制工程实施性施工组织设计，以明确技术保证和质量保证要求。主持关键工序攻关和人员的培训，编写有关的成果报告和施工技术总结。监督检查采购物资的检验和试验及设备的控制，组织不合格品的评审和处理。制订和实施纠正措施及预防措施，严把&amp;quot;图纸、测量、试验&amp;quot;关。&lt;/p&gt;
&lt;p&gt;认真执行质量管理制度，把施工图纸审签制，技术交底制，质量&amp;quot;三检制&amp;quot;，隐蔽工程检查签证制，质量检查评比奖惩制，验工计价质量签证制，分项工程质量评比制，质量事故（隐患）报告处理制等行之有效的管理制度落实到施工全过程，使工程质量始终处于受控状态。主持日常质量检查监督工作，并在技术上指导施工生产，确保施工一次合格。加强文件和资料的控制，建立质量记录。推行全面质量管理，提高职工的质量意识。&lt;/p&gt;
&lt;h2&gt;4、工程质量控制保证措施&lt;/h2&gt;
&lt;h3&gt;（1）工程质量控制措施&lt;/h3&gt;
&lt;p&gt;工程测量与试验控制措施
遵循&amp;quot;从整体到局部，先控制后细部&amp;quot;的施工测量原则，精确建立施工控制网。
施工过程中每进行一步都进行实时监控，保证每一步工作都无误。&lt;/p&gt;
&lt;p&gt;所敷设管道需进行防腐防裂面漆涂刷，保证其在高温、低温情况下不出现开裂、渗漏等问题。&lt;/p&gt;
&lt;h3&gt;（2）施工过程质量控制&lt;/h3&gt;
&lt;p&gt;施工质量控制的重点是施工过程的控制，施工过程是否规范将直接影响工程的质量，故施工过程必须始终受控。&lt;/p&gt;
&lt;p&gt;工程施工过程质量控制流程：&lt;/p&gt;
&lt;p&gt;施工机具控制 → 环境控制 → 施工过程 → 施 工 准 备 → 最 终 检 验
↑ ↓
计量器具试验设备控制 ← 质量技术文件控制 ← 过程质量监控与验证&lt;/p&gt;
&lt;h3&gt;（3）施工过程分类及控制要点&lt;/h3&gt;
&lt;p&gt;为了便于有效的控制施工过程的质量，根据安装工程施工的性质和特点，将施工过程划分为：一般过程、关键过程、特殊过程。&lt;/p&gt;
&lt;p&gt;铺设管道破除路面恢复：场地平整→原有地面破除→底层平整原土打夯→水稳层铺设→砼路面浇筑→路面工程收尾工程。&lt;/p&gt;
&lt;p&gt;管道施工：测量、放样→开挖沟槽→垫层基础→安管、护管→接口、管座施工→检查井等构造物安装→闭水试验→回填夯实。&lt;/p&gt;
&lt;h2&gt;5、工程质量保证措施&lt;/h2&gt;
&lt;p&gt;工程的施工由工程项目施工技术人员提供必备的施工文件。进行详细的分项工程技术交底；作业人员按图纸、规范、标准的要求操作。在过程操作及其质量控制中，作业人员要坚持开展&amp;quot;三工序&amp;quot;活动，即&amp;quot;检查上道工序、保证本工序、服务下道工序&amp;quot;，使过程始终处于受控状态。&lt;/p&gt;
&lt;p&gt;工程质量检查以班组自检和专职检查相结合。施工班组在下班前要对当天的施工作业成果进行质量自检，对不符合质量要求的予以纠正。各工序工作完成后，由分管工序的技术人员，质检员组织工（班）长按有关技术规范要求进行检查，不合格的坚决返工，上道工序不合格不得开始下道工序施工，班组在进行工序交接时必须有明确的质量合格交接意见，严格执行&amp;quot;三工序&amp;quot;制度。 每道工序完成并自检合格后，通知驻地监理验收，并做好相关验收记录和工程检查签证资料整理工作。 加强技术人员对工程质量的监督，并完善施工记录。&lt;/p&gt;
&lt;p&gt;过程试验由施工技术人员按《检验和试验程序》组织进行，班组设兼职质检员,负责班组质量自检和自检资料的填写、整理工作,班组的每个操作者对自己的工程质量随时进行自检,工序交接坚持互检,合格后才能进行下道工序的施工。&lt;/p&gt;
&lt;p&gt;专检由质检员负责，质检员根据施工现场的进度做好工序跟踪控制的专职检查并及时做好记录。对查出的质量问题如实填写&amp;quot;整改通知&lt;img src=&quot;media/image2.png&quot; alt=&quot;&quot; /&gt;{width=&amp;quot;1.2916666666666667in&amp;quot; height=&amp;quot;0.4027777777777778in&amp;quot;}单&amp;quot;，通知有关人员限期整改。&lt;/p&gt;
&lt;p&gt;隐蔽工程检查是在班组自检的基础上，由施工员填写隐蔽工程检查记录，通知质检部门和业主代表共同检查并签字认可后，方可隐蔽。&lt;/p&gt;
&lt;p&gt;不同专业工种之间的过程交接由项目技术负责人组织质检员，相关施工单位的技术人员及有关人员参加，进行检查验收，交付方出具中间交接资料接收方复查认可后，办理中间交接手续。&lt;/p&gt;
&lt;p&gt;工程质量验评：分项、分部工程完成后，由施工技术员进行分项、分部工程质量预检并填写分项、分部质量检验评定表，由项目经理组织评定，由质检部门核定质量等级。&lt;/p&gt;
&lt;h2&gt;6、现场质量保证的承诺&lt;/h2&gt;
&lt;p&gt;(1) 坚持按设计施工，对设计图纸理解不清时，主动请教相关技术人员。无设计变更手续，不擅自改变设计。&lt;/p&gt;
&lt;p&gt;(2) 图纸与现场情况不符及设计中有错漏的问题时要以对工程负责的态度及时向设计代表提出。&lt;/p&gt;
&lt;p&gt;(3) 工程施工中的关键难点部位由专业人员负责，同时与监理、建设单位共同监督，保证工程的质量，针对施工方案提出建议和解决方法。有必要时，提出两种以上可选择方案，供施工定案参考。&lt;/p&gt;
&lt;p&gt;(4) 如达不到工程的质量标准，并一次验收合格，我公司愿承担相应的法律责任及经济处罚。&lt;/p&gt;
&lt;h1&gt;九、确保安全生产的技术组织措施&lt;/h1&gt;
&lt;h2&gt;1、安全生产目标及方针&lt;/h2&gt;
&lt;p&gt;① 安全生产目标：确保工程零事故，人员零损伤；&lt;/p&gt;
&lt;p&gt;② 安全生产方针：安全第一，预防为主。&lt;/p&gt;
&lt;h2&gt;2、安全质量体系&lt;/h2&gt;
&lt;p&gt;安全管理是一项系统工程，是搞好生产的重要因素，关系到国家、企业和职工的切身利益，关系到工程建设的目标的实现。因此在施工过程中必须坚决贯彻&amp;quot;安全第一，预防为主&amp;quot;的方针，建立健全安全生产保证体系和各级安全岗位责任制，责任落实到人。充分发挥各级专职安检人员的监督作用，及时发现和排除安全隐患。&lt;/p&gt;
&lt;p&gt;广泛应用安全系数工程和事故分析方法，严格控制和防止各类伤亡事故。本工程安全生产保证体系主要由组织保证体系和监督保证体系构成。组织保证体系的主要内容有：成立项目安全领导小组，建立项目安全生产责任制，进行安全生产教育，支持班组安全制度。监督保证体系的主要内容有：施工过程的安全监督检查，安全事故的分析处理制度，安全生产奖兑现制度。&lt;/p&gt;
&lt;h2&gt;3、安全生产保证措施&lt;/h2&gt;
&lt;p&gt;为了实现安全生产合格的目标，在建立和完善项目安全生产保证体系的同时，还要落实安全生产的各项保证措施，具体措施如下:&lt;/p&gt;
&lt;h3&gt;（1）安全综合保证措施&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;⑴ 工程开工前，建立健全如下各项安全制度及防护措施。&lt;/strong&gt;
① 机械的操作要求及安全作业制度；;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;
&lt;p&gt;用电安全须知及电路架设养护作业制度：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;便道便桥通行及养护作业制度；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;施工现场安全作业制度；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;施工区域防洪、防火、防风措施；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;爆炸物品安全保管和领取制度及安全运输制度；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有关劳动保护法和领取制度及安全运输制度；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;起重作业安全作业制度；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;各种安全标志的设置及维护措施。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本项目在开工前，由项目经理部编制实施性安全技术施工组织设计，对技术复杂、施工危险性大、多发易发事故的深基坑作业等施工项目，编制专项安全施工组织设计，认真执行安全生产&amp;quot;五同时&amp;quot;原则，制定和采取严格的安全技术措施，确保施工安全；&lt;/p&gt;
&lt;p&gt;实行逐级安全技术交底制，由经理部组织有关人员对工程项目或专项进行书面详细安全技术交底，凡参加安全技术交底的人员要履行签字手续，并保存资料。项目经理部专职安全员要对安全技术措施的执行情况进行监督检查，并作好记录；&lt;/p&gt;
&lt;p&gt;深化安全教育，强化安全意识。施工人员上岗前必须进行安全教育和技术培训，牢记&amp;quot;安全第一&amp;quot;的宗旨，安全员坚持持证上岗。针对工程特点，对所有从事管理和生产的人员进行全面的安全教育，重点对专（兼）职安全员、领工员、班组长、从事各种作业的工种、场内机动车辆以及新工上岗、工人变岗和改变工艺等进行培训教育；特种工种的操作人员的安全教育、考核、复验，严格按照《特种作业人员安全技术考核管理规定》执行。经过培训考核，获取操作规程证方能持证上岗，对已取得上岗证的特种作业人员，要进行登记存档，对上岗证要按期复审，并设专人管理；对从事施工管理和生产的人员，未经安全教育的不准上岗；新工人（含民工、临时工）未进行三级教育的不准上岗；变换工种或采用新技术、新工艺、新设备、新材料没有进行培训不准上岗；通过安全教育，增强职工安全意识，树立&amp;quot;安全第一、预防为主&amp;quot;的思想；掌握基本生产知识和安全操作技能；提高职工遵守施工安全纪律的自觉性，认真执行安全操作规程，做到：不违章指挥、不违章操作、不伤害自己、不伤害他人、不被他人伤害，达到提高职工整体安全防护意识和自我防护能力；安全教育要经常化、制度化。建立完善的安全工作保证体系。对特种作业人员必须经培训合格后持证上岗；对新职工及合同工必须进行项目部、作业队和班组三级安全教育和定期培训；通过安全竞赛、现场安全标语、图片等宣传形式，增强全员安全生产的自觉性，时时处处注意安全，把安全生产工作落到实处。&lt;/p&gt;
&lt;h3&gt;（2）认真执行安全检查制度&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;严格安全监督，建立和完善定期安全检查制度。各级安全监督人员要经常检查，真正把事故消灭在萌芽状态。经理部要保证检查制度的落实，要规定定期检查日期及参加检查的人员，经理部每旬进行一次；作业班组每天进行一次，非定期检查应视工程情况如施工准备前、施工危险性、采取新工艺、季节性变化、节假日前后等要进行检查，并要有领导值班，对检查中发现的安全问题按照&amp;quot;四不放过&amp;quot;的原则制定整改措施，定人限期进行整改，保证&amp;quot;管生产必须管安全&amp;quot;的原则真正落实。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;（3）事故报告制度&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;① 无论何时，一旦发生危害工程安全、工程进度、工程质量事故时，除采取必要的抢救措施以外必须立即暂停此项目和与之有关的项目的施工；&lt;/p&gt;
&lt;p&gt;② 事故发生后，必须以最快的方式，将事故的简要情况报监理工程师；&lt;/p&gt;
&lt;p&gt;③ 监理工程师视察了事故现场后立即上报并提出处理意见，应按照监理工程师指示消除事故产生的危害和影响，并查明事故原因。若事故原因迟迟未能查明，监理工程师认为事故隐患未消除时，不能恢复开工。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;（4）加强安全防护，设置安全防护标志&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;① 施工现场按规定悬挂&amp;quot;七牌二图&amp;quot;与安全标牌；&lt;/p&gt;
&lt;p&gt;② 加强安全防护，设置安全防护标志，施工作业设立安全栏杆、安全网。作业人员严禁酒后上岗，严格遵守操作规程，对违章作业又不听劝阻者要从严惩处，绝不姑息迁就，创造一个重视安全、处处遵章、文明施工的环境；&lt;/p&gt;
&lt;p&gt;③ 认真做好防洪、防火、防雷工作，驻地和库房要远离洪泛区，重点设备重点防护，对易燃、易爆、有毒器材按有关规定妥善保管，登记造册发放，责任落实到人，彻底消除不安全因素；&lt;/p&gt;
&lt;p&gt;④ 定期或根据施工需要发放和检查施工所用的各种安全机具设备和劳动保护用品。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;（5）抓好现场管理，搞好文明施工&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;抓好现场管理是做好安全工作的一个重要环节，易燃易爆品妥善保管，工程材料的合理堆放，各种交通、施工信号标示明晰，保障人身、机械和器材的安全。在行人道路处开挖基坑及施工危险地段要设置安全警示牌，以防意外事故发生。正确使用水、电线路，施工工序有条不紊。文明施工，安全生产；&lt;/p&gt;
&lt;p&gt;实行项目经理负责制，明确项目经理在施工安全管理中的主体地位，在施工过程中对本项目的施工安全负全面责任。项目经理是项目上具体实施的代表人，对本项目安全负总的组织领导责任；&lt;/p&gt;
&lt;p&gt;全面落实安全生产责任制，做到责权利相统一，层层签订安全生产包保责任状，把安全生产职责落实到每一级领导，落实到每一个工点，每一道工序，每一个职工。各项经济承包有明确的安全指标和包括奖惩办法在内的保证措施，严格考核，奖罚分明；&lt;/p&gt;
&lt;p&gt;工程项目部要求成立安全生产领导小组，由项目经理任组长。其任务是：定期召开安全生产会议，分析安全生产形势，总结和部署安全生产工作，组织安全培训教育、开展安全生产检查活动等。加强班组建设。执行&amp;quot;三工、三检&amp;quot;和&amp;quot;周一&amp;quot;安全互检，集思广益，发现问题，找出隐患，杜绝&amp;quot;三违&amp;quot;，把事故消灭在萌芽状态。认真实施标准化作业，严肃施工纪律和劳动纪律，杜绝违章指挥与违章操作，保证防护设施的投入，使安全生产建立在管理科学、技术先进，防护可靠的基础上。重点工程和技术复杂的新、难、重点项目，不良气候条件下的危险性大的作业项目，要结合现场和实际情况，编制专门的安全措施，进行安全技术交底，由施工技术负责人和专职安全管理人员监督实施。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;（6）安全生产保证措施&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⑴ 施工用电安全&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;严格按有关规定安装线路及设备，用电设备都要安装地线，不合格的电气器材严禁使用，库房、现场严禁烟火。&lt;/p&gt;
&lt;p&gt;① 现场照明：照明电线绝缘良好，导线不得随地拖拉或绑在脚手架上。照明灯具的金属外壳必须接零。室外照明灯具距地面不低于3m，室内距地面不低于2.4m；&lt;/p&gt;
&lt;p&gt;② 配电箱、开关箱：使用BD型标准电箱，电箱内开关电器必须完整无损，接线正确，电箱内设置漏电保护器，选用合理的额定漏电动作电流进行分级匹配。配电箱设总熔丝、分开关，动力和照明分别设置，金属外壳电箱作接地或接零保护，开关箱与用电设备实行一机一闸保险，同一移动开关箱严禁有380V和220V两种电压等级；&lt;/p&gt;
&lt;p&gt;③ 架空线：架空线必须设在专用电杆(水泥杆、木杆)上，严禁架设在树或脚手架上，架空线装设横担和绝缘子。&lt;/p&gt;
&lt;p&gt;④ 接地接零：接地采用角钢、圆钢或钢管，其截面不小于48mm^2^，一组二根接地之间间距不小于2.5m，接地电阻符合规定，电杆转角杆，终端杆及总箱，分配电箱必须有重复接地。&lt;/p&gt;
&lt;p&gt;⑤ 用电管理：安装、维修或拆除临时用电工程，必须由电工完成，电工必须持证上岗，实行定期检查制度，做好检查记录。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;⑵ 机械设备安全&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;① 所有施工设备和机具在使用时均必须由专职人员负责进行检查必要的试验和维修保养，确保状况良好。各技术工种必须经过培训并经考核取得合格证，方可持证上岗操作，杜绝违章作业。大型机械的保险、限位装置防护指示器等必须齐全可靠；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;② 驾驶、指挥人员必须持证上岗，必须按规程要求进行操作，驾驶员应作好例保和记录；&lt;/p&gt;
&lt;p&gt;③ 各类安全(包括制动)装置的防护罩、盖等要齐全可靠；&lt;/p&gt;
&lt;p&gt;④ 机械与输电线路(垂直、水平方向)须按规定保持距离；&lt;/p&gt;
&lt;p&gt;⑤ 作业时，机械停放稳固，臂杆幅度指示器灵敏可靠；&lt;/p&gt;
&lt;p&gt;⑥ 电缆线绝缘良好，不得有接头，不得乱拖乱拉。&lt;/p&gt;
&lt;p&gt;⑦ 各类机械配挂技术性能牌和上岗操作人员名单牌；&lt;/p&gt;
&lt;p&gt;⑧ 必须严格定期保养制度，做好操作前、操作中和操作后设备的清洁润滑、紧固、调整和防腐工作。严禁机械设备超负荷使用、带病运转和在作业运转中进行维修；&lt;/p&gt;
&lt;p&gt;⑨ 机械设备夜间作业必须有充足的照明，夜间施工要有良好的照明设备。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;⑶ 防火安全措施&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;① 建立经理部、作业队、班组三级防火责任制，明确职责；&lt;/p&gt;
&lt;p&gt;② 重点部位如仓库、木工间配置相应消防器材，一般部位如宿舍、食堂等处设常规消防器材；&lt;/p&gt;
&lt;p&gt;③ 施工现场用电，严格执行有关规定，加强电源管理，防止发生电器火灾。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;十、确保文明施工的技术组织措施&lt;/h1&gt;
&lt;h2&gt;1、文明施工目标&lt;/h2&gt;
&lt;p&gt;文明施工目标：确保达到甲方要求的标准。&lt;/p&gt;
&lt;h2&gt;2、文明施工措施&lt;/h2&gt;
&lt;p&gt;（1）施工现场用彩板作围挡，高度不得低于1.8m；&lt;/p&gt;
&lt;p&gt;（2）在大门外侧按规定设施工标志牌，内侧设置企业统一格式的&amp;quot;一图四板&amp;quot;及施工标志牌（即施工平面布置图、安全生产制度板、消防保卫制度板、环境保护制度板、文明施工制度板），制度内容符合文明施工要求并切实可行；&lt;/p&gt;
&lt;p&gt;（3）施工现场道路进行硬化处理。按照平面布置设立临建设施；&lt;/p&gt;
&lt;p&gt;（4）施工现场材料、成品、半成品严格按平面布置图堆放，并做到码放整齐美观，保证场区整洁；&lt;/p&gt;
&lt;p&gt;（5）生产区机械设备定点停放、整齐干净；材料按施工设计位置离地挂牌堆码整齐有序，需防雨的材料进库存放或加盖防雨蓬布。&lt;/p&gt;
&lt;p&gt;（6）电缆线统一规划，按施工设计布设；&lt;/p&gt;
&lt;p&gt;（7）施工排水措施得当，确保施工场内排水畅通、无积水；&lt;/p&gt;
&lt;p&gt;（8）明确划分施工区和生活区，并实行责任区分工负责制，确保施工现场整洁、环境优美；&lt;/p&gt;
&lt;p&gt;（9）所有临时占地，在工程结束后，迅速拆除临时建筑，清理现场杂物后，恢复原状；&lt;/p&gt;
&lt;h2&gt;3、环境保护措施&lt;/h2&gt;
&lt;p&gt;本工程地处武汉经济开发区晨鸣厂区内，环保工作意义尤其重大。项目经理部成立环境保护领导小组，由项目经理经理任组长，负责组织做好工地环保工作；由项目经理部总工程师任副组长，负责环保技术措施的制定、交底工作；现场设环保监督员，负责施工现场日常环保监督检查工作，发现问题及时解决。&lt;/p&gt;
&lt;h3&gt;（1）噪音控制措施：&lt;/h3&gt;
&lt;p&gt;① 选择低噪音机具进行施工；&lt;/p&gt;
&lt;p&gt;② 严格遵守建委夜间施工作业时间规定，合理安排施工时间；&lt;/p&gt;
&lt;p&gt;③ 现场木工棚采用吸音材料进行封闭降噪处理；&lt;/p&gt;
&lt;p&gt;④ 振捣混凝土时严禁振捣钢筋和模板，以降低噪音污染；&lt;/p&gt;
&lt;p&gt;⑤ 教育职工不得敲打钢管、钢模板，尽量减少噪音；&lt;/p&gt;
&lt;p&gt;⑥ 加强对操作人员的教育，早晚施工不大声暄哗，建筑物资轻拿轻放，不从上往下扔东西，并做好施工中的计划调控。&lt;/p&gt;
&lt;h3&gt;（2）污水处理措施&lt;/h3&gt;
&lt;p&gt;① 施工废水不排入随处乱倒污染医院环境、按要求进行废水沉淀处理，经滤网过滤后通过污水管输入池中沉淀，并做好除油处理；&lt;/p&gt;
&lt;p&gt;② 搅拌机、洗车处等排放污水处均设沉淀池。清洗搅拌机和运输车辆的污水，未经沉淀处理不得直接排入城市排水设施；&lt;/p&gt;
&lt;p&gt;③ 施工污水经沉淀后可作现场洒水降尘之用。&lt;/p&gt;
&lt;h3&gt;（3）降低扬尘措施&lt;/h3&gt;
&lt;p&gt;① 施工现场采取措施降低扬尘，并按作业组划分区域管理，指定专人每天洒水清扫，保持清洁；&lt;/p&gt;
&lt;p&gt;② 建筑垃圾采用容器吊运，严禁随意凌空抛撒，施工现场设置密闭式垃圾站用于存放施工垃圾，并采用密闭容器及时清运消纳；&lt;/p&gt;
&lt;p&gt;③ 指定专人负责出入车辆的清洗及出入口周围环境及道路的清扫工作，运输车辆不带泥沙出现场，并做到沿途不遗洒；&lt;/p&gt;
&lt;p&gt;④ 土方及材料等松散材料运输时，采用遮盖或者固化措施，防止粉尘对大气的污染，各类机动车完善消排烟系统，减少尾气排放，减少对大气的污染；&lt;/p&gt;
&lt;p&gt;⑤ 原有地面开挖期间，建筑垃圾运输车辆在出现场时进行车轮清洗，土方高度应底于车侧帮15cm，并遮盖，夏季遇4级以上大风天气时，停止土方施工并做好遮盖工作；&lt;/p&gt;
&lt;p&gt;⑥ 施工现场设置的搅拌机，必须配备降尘防尘装置。&lt;/p&gt;
&lt;h1&gt;十一、雨季和冬季施工方案&lt;/h1&gt;
&lt;p&gt;根据该工程施工进度计划安排，工程施工可能经历雨季及冬季气候，在施工前，要按照雨季和冬季气候施工有关要求，结合当时的施工部位，编制好施工方案，并提前做好各项准备工作。&lt;/p&gt;
&lt;h2&gt;雨期及冬季气候施工措施&lt;/h2&gt;
&lt;p&gt;⑴ 材料及机具准备：提前准备好雨布、水泵、雨靴等防雨材料；&lt;/p&gt;
&lt;p&gt;⑵ 开工前做好路面硬化，修设路边排水沟，做到有组织排水以保证水流畅通，雨后不滑不陷、现场不存水；&lt;/p&gt;
&lt;p&gt;⑶ 在所施工区域进行临时雨棚和防晒棚搭设，在雨季及炎热气候时用于遮挡，在天气寒冷时适当减少早晚日期出工时间，尽量工作时间安排避开寒冷期；&lt;/p&gt;
&lt;p&gt;⑷ 所有机械棚要搭设严密，防止漏雨，机电设备采取防雨防淹措施，安装接地装置，机动电闸箱的漏电保护装置要可靠；&lt;/p&gt;
&lt;p&gt;⑸ 工地成立雨施领导小组，定期或不定期对各项工作进行检查落实，发现问题及时解决。&lt;/p&gt;
&lt;h1&gt;十二、成品保护和工程保修工作的管理措施和承诺&lt;/h1&gt;
&lt;p&gt;成品保护和工程保修是工程后期质量管理的重要环节，对于承包商而言，实施完善的成品保护，提供快速优质的保修服务，既有利于促进工程质量、降低工程成本，也有利于提升企业的履约形象和社会信誉。&lt;/p&gt;
&lt;h2&gt;1、成品保护组织机构及管理&lt;/h2&gt;
&lt;p&gt;为了切实搞好成品保护，应随着工程的进展逐步制定相应的保证制度：&lt;/p&gt;
&lt;p&gt;⑴ 成立以项目经理为组长，以项目总工程师、项目副经理为副组长，由各相关部门、专业项目负责人组成的成品保护领导小组，专门负责指导、协调施工过程中的成品保护工作。成品保护领导小组下设专职保护成品巡视员组成的成品保护队，监督成品保护措施的落实。发现成品破坏立即制止，并报告成品保护小组，采取措施恢复原状；&lt;/p&gt;
&lt;p&gt;⑵ 分清上道工序和下道工序在成品保护方面的责任。在上、下两道工序交接时，应同时检查成品情况，已经损坏的成品由上道工序的班组负责，检查后损坏的成品由下道工序的班组负责；&lt;/p&gt;
&lt;p&gt;⑶ 交接检查由工长组织，上、下工序的班组长参加。如不组织交接检，出现的成品损坏由工长负责，如有一方的班组长不参加交接检，出现成品损坏由该班组长负责；&lt;/p&gt;
&lt;p&gt;⑷ 分清穿插作业中成品保护的责任。一般情况下，成品损坏由损坏者负责。在穿插作业时责任确实难辨时，由平时使用、保管的人或班组负责；&lt;/p&gt;
&lt;p&gt;⑸ 建立严格的奖惩制度：污染的成品由责任者负责处理干净，恢复原样或按实际发生的工料费赔偿；损坏的成品由责任者按损坏程度予以赔偿；经查实属蓄意破坏成品者，视情节予以罚款、行政处分。&lt;/p&gt;
&lt;h2&gt;2、成品保护奖罚措施&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;⑴ 对破坏成品的人员要记录在册，注明发生日期、破损部位、造成损失，并进行说服教育。初次违反者照价赔偿，二次者处以双倍罚款，第三次劝其离场；&lt;/p&gt;
&lt;p&gt;⑵ 要定期召开成品保护分析会，表扬成品保护好的班组或个人，并给予个人50～200元的奖励，对成品保护表现差的班组或个人要公开批评，并对个人处以50～200元罚款。造成较大损失的还要对所属施工队进行罚款；&lt;/p&gt;
&lt;p&gt;⑶ 成品保护不仅是省工省料的问题，也是体现文明施工，确保工程质量、进度的一个很重要的方面，自始至终要高度重视。除了以上制度、措施外，还应科学合理地安排工序交接，成品保护小组及专职保护成品巡视员加强监督成品保护措施的落实。对违反保护措施、故意破坏的给与及时纠正和严肃处理。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;十三：售后服务承诺&lt;/h1&gt;
&lt;h2&gt;售后服务承诺书&lt;/h2&gt;
&lt;p&gt;为保证工程在施工完成后达到建设单位对工程质量及工程回访、保修等方面的要求，最大限度达到工程的建设目的，满足建设单位的要求，我公司就工程质量保修向贵单位承诺以下职责：&lt;/p&gt;
&lt;p&gt;1、保修服务范围：&lt;/p&gt;
&lt;p&gt;（1）保修的内容按建设部《建设工程质量管理条例》及《工程施工承包合同》、《工程质量保修书》中的规定执行；&lt;/p&gt;
&lt;p&gt;（2）对于工程承包范围内的施工项目，自工程竣工合格之日起进入工程质量保修阶段，在保修阶段，凡因工程不符合规程、规范和工程合同规定所造成的工程实体损坏，我公司将无条件进行保修；&lt;/p&gt;
&lt;p&gt;（3）由于工程设计、社会人为因素或已超出工程质量保修期限的问题，我公司按照业主认可的工程技术维修方案及费用进行修复处理；&lt;/p&gt;
&lt;p&gt;（4）因不可抗力，如地震、洪水或50年难得一遇的大灾害等原因对工程造成的破坏，与业主协商确定修复方法，并按照相关规定确定施工单位与建设单位的承担范围。&lt;/p&gt;
&lt;p&gt;2、保修期限&lt;/p&gt;
&lt;p&gt;根据工程性质并严格遵守工程施工合同及保修书中的规定，确定工程质量的保修期限，完全响应招标人的要求。&lt;/p&gt;
&lt;p&gt;3、工程保修及服务承诺&lt;/p&gt;
&lt;p&gt;（1）我单位对所提供的产品及施工自可投入使用之日起，严格按照施工合同约定的有关保修条款执行；&lt;/p&gt;
&lt;p&gt;（2）严格贯彻公司的质量方针、本着客户至上的原则，服务热情周到、随叫随到；&lt;/p&gt;
&lt;p&gt;（3）建立回访制，每个月定期回访，认真听取建设单位意见并形成回访记录；&lt;/p&gt;
&lt;p&gt;（4）按照工程维修时间的紧急程度确定事故的处理方法，并做到以下：&lt;/p&gt;
&lt;p&gt;在保修期内，成品一旦出现问题，我公司免费提供人员及材料免费进行迅速抢修，承诺接到业主维修通知后当日内投入维修工作；如遇紧急抢修工作，我公司人员在接到通知后半小时内响应，1小时内赶到施工现场组织人员进行抢修。&lt;/p&gt;
&lt;p&gt;综上所述，我公司郑重承诺，在工程质量保修阶段，我单位将本着用户至上的原则，让业主满意。客户的满意和支持，将是我单位生存的源泉之水，在工程施工、质量保修阶段，我单位将始终如一的为业主服务。&lt;/p&gt;
&lt;h1&gt;十四、项目组织管理机构及劳动力安排&lt;/h1&gt;
&lt;h2&gt;1、项目组织管理机构职责划分&lt;/h2&gt;
&lt;p&gt;按照组织机构设置，结合招标内容和施工合同要求，组织机构中的管理人员和部门对应划分管理职能，确保各项工作做到：管理分主次，责任到人头。&lt;/p&gt;
&lt;h3&gt;（1）各部门职责&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;部门名称&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;部门职能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;工程质量管理部&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 执行国家和地方的有关工程建设的法律、规范、标准和规程；&lt;br&gt;2 编制项目质量计划，确定施工项目的总体质量目标，并进行目标分解；&lt;br&gt;3 对工程施工实施过程质量控制和管理，与政府、业主质量部门对接工作；&lt;br&gt;4 负责质量资料的编制、汇总，并参与工程竣工资料的汇总和编写；&lt;br&gt;5 具体负责质量体系的运行，进行质量培训、质量检查和质量评定工作；&lt;br&gt;6 参与分包商、供应商的选择，并进行日常的管理；&lt;br&gt;7 编制质量奖罚办法，并监督落实；&lt;br&gt;8 负责工程质量创优计划的策划、编写和实施；&lt;br&gt;9 负责质量事故的处理，并编制相应的整改计划和措施，并监督落实。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;工程技术管理部&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 负责整个项目的施工技术管理工作；&lt;br&gt;2 参与编制项目质量计划、职业健康安全管理计划、环境保护计划等；&lt;br&gt;3 编制专题方案和各类技术方案，并对分包商的施工方案和施工工艺进行评审，参与材料设备的选型和招标，并负责设计变更；&lt;br&gt;4组织图纸内部会审，掌握工程设计和施工图纸的最新变化，为工程施工提供相应的支持；&lt;br&gt;5 负责施工过程中的测量、计量和试验管理；&lt;br&gt;6 负责各个阶段的资料收集和整理，负责工程竣工资料的编写和归档工作。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;深化设计管理部&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1协助组织图纸内部会审，负责设计的协调管理以及专业分包的深化设计审核工作；与设计、业主方保持紧密联系，掌握工程设计和施工图纸的最新变化，为工程施工提供相应的支持；协调自行施工专业深化设计的协调与配合；对工程所有专业的深化设计进行设计总协调；就设计方面的问题向设计方和业主提出合理化建议；&lt;br&gt;2 在项目内部进行设计交底，负责工程施工的各类工况演算和分析，编制整体变形控制方案、变形监测方案；&lt;br&gt;3 负责机电系统的管线综合。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;工程管理部&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 负责基础、主体结构、机电安装工程等全过程的工程施工组织、计划落实、方案实施，并进行工序控制和施工协调。&lt;br&gt;2 完成施工前期准备工作；&lt;br&gt;3 根据工程进度提出相应的进度计划、资源计划，并落实实施；&lt;br&gt;4 进行质量、安全、环保等方面但管理和配合协调；&lt;br&gt;5 参与质量验收、阶段验收和竣工验收工作；&lt;br&gt;6 负责施工现场管理，与业主和监进行施工生产方面的业务联系和对接；&lt;br&gt;7 负责专业分包商的全面管理和协调。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;机电安装管理部&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 负责机电安装工程全过程的工程施工组织、计划落实、方案实施，并进行工序控制和施工协调。&lt;br&gt;2 完成施工前期准备工作；&lt;br&gt;3 根据工程进度提出机电安装工程相应的进度计划、资源计划，并落实实施；&lt;br&gt;4 进行机电安装工程质量、安全、环保等方面但管理和配合协调；&lt;br&gt;5 参与机电安装工程质量验收、阶段验收和竣工验收工作；&lt;br&gt;6 负责施工现场管理，与业主和监进行施工生产方面的业务联系和对接；&lt;br&gt;7 负责专业分包商的全面管理和协调；&lt;br&gt;8 负责现场临地用水用电管理。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;总包协调管理部&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 负责前期施工现场临时水电的布置、安装和日常维护；&lt;br&gt;2负责独立分包单位的进度计划管理、场内运输、施工工序及工作面协调；&lt;br&gt;3 负责施工过程中范围内的预留预埋核对；&lt;br&gt;4 负责机电安装工程的施工总包管理，与土建、装饰专业进行协调；&lt;br&gt;5 负责机电专业深化设计的协调管理；参与各专业的调试运行和联合调试运行；&lt;br&gt;6负责提请和安排项目的内部生产协调例会，协调各专业分单位之间的施工问题；&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;安全环境管理部&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 负责项目安全生产、文明施工和环境保护及职业健康等工作；&lt;br&gt;2 负责编制项目职业健康安全管理计划、环境管理计划和管理制度并监督实施；&lt;br&gt;3 负责安全生产和文明施工的日常检查、监督、消除隐患等管理工作；&lt;br&gt;4 制定员工安全培训计划并组织实施，负责管理人员和进场工人安全教育工作；负责安全技术审核把关和安全交底；&lt;br&gt;5 负责每周全员安全生产例会，与各分包商保持联络，定期主持召开安全工作会议；&lt;br&gt;6负责安全目标的分解落实和安全生产责任制的考核评比；负责开展各类安全生产竞会议和宣传活动；&lt;br&gt;7 制定安全生产应急计划，保证一旦出现意外，能立即按规定报告各级政府机构。&lt;br&gt;8 保证项目施工生产的正常进行，负责准备安全事故报告；&lt;br&gt;9 在危急情况下有权向施工人员发出停工令，直至危险状况得到改善为止；&lt;br&gt;10负责安全生产日志和文明施工资料的收集整理工作；&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;物资设备管理部&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 负责编制项目物资领用管理制度和日常管理工作；&lt;br&gt;2 负责物资进出库管理和仓储管理；&lt;br&gt;3 负责对材料的标识作统一策划；&lt;br&gt;4 负责监督检查所有进场物资的质量，协助资料员做好技术资料的收集整理工作；&lt;br&gt;5 具体负责竣工时库存物资的善后处理；&lt;br&gt;6 负责编制项目大型机械施工管理计划，在主管项目副经理的领导下统一调配塔吊、施工升降机等机械的调配使用。&lt;br&gt;7 负责大型施工机械的维修保养，确保施工机械使用正常；&lt;br&gt;8 参与编制项目质量计划、项目职业健康安全管理计划、环境管理计划；&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;商务合约管理部&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 负责项目预算成本的编制和商务合约工作；&lt;br&gt;2 负责项目分包招标文件的编制工作；负责分包商选择工作；参与供应商选择工作；&lt;br&gt;3 参与项目质量保证计划的编制工作；配合财务编制开支预算和资金计划；&lt;br&gt;4 负责与业主和分包的结算工作，编制项目月度请款、分包付款文件；&lt;br&gt;5 负责项目合同管理、造价确定以及二次经营等事务的日常工作；&lt;br&gt;6 负责准备竣工决算报告其他与商务方面的工作。&lt;br&gt;7 负责项目法律事务。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;财务资金管理部&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 负责项目成本控制和资金管理工作；&lt;br&gt;2 负责编制开支预算和资金计划；&lt;br&gt;3 负责项目财务和税务事务；负责项目资金计划和各类财务报表的编制工作；&lt;br&gt;4 积极配合业主财务安排，确保项目资金运作安全，满足工程需要；制定项目的资金需用计划及财务曲线，按月填报实施动态管理；&lt;br&gt;5具体负责对接银行业务和合法纳税业务，包括协助物资采购部的进口纳税业务；&lt;br&gt;6具体负责工程款的收支工作；负责工资奖金发放工作；配合商务合约部成本控制工作和准备竣工决算报告；&lt;br&gt;7 负责项目资金管理，建立项目资金帐户，做到专款专用。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;11&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;资源调度办公室&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 负责项目人员的调动及日常管理；&lt;br&gt;2 负责项目内部的文化宣传；&lt;br&gt;3负责项目办公设备配置与管理，来往文件签转、打印、登记工作；&lt;br&gt;4 负责施工现场的保卫；&lt;br&gt;5 负责项目的后勤服务工作及对所有分包商相关工作的管理。&lt;br&gt;6负责对外事务工作，进行社会各方面的工作协调，为施工创造良好的外部环境；&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;（2）各岗位职责&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;岗位名称&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;分工&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;管理职责&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;项目经理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;全面工程管理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1遵守国家、行业和地方有关法律、法规、标准、规范，维护企业的合法权益；&lt;br&gt;2组织贯彻实施企业管理标准、技术标准和各项规章制度；&lt;br&gt;3明确项目的质量、职业健康安全、环境管理、成本控制等管理目标，并分解到各相关岗位，实现《项目管理责任书》中规定的各项工作目标；&lt;br&gt;4明确人员职责和权限，有效管理项目团队，合理配置和使用项目资源，科学实施项目管理；&lt;br&gt;5组织项目人员学习标准、规范和体系文件及其他有关知识，满足各项管理工作的需要；&lt;br&gt;6组织施工过程的策划，编制施工组织设计和质量计划、职业健康安全与环境管理规划、管理方案、各类专项施工方案等策划文件；&lt;br&gt;7审批项目受控文件清单、记录管理清单、项目采购文件等文件；&lt;br&gt;8审批项目编制的不符合处置方案、纠正和预防措施，督促项目有关人员落实；&lt;br&gt;9建立适当的沟通、协商和信息交流渠道，积极处理和协调各方关系；&lt;br&gt;10正确处理企业内外之间的各种利益关系，履行《项目管理责任书》和企业与业主签订的工程承包合同；&lt;br&gt;11接受企业的监控与考核；&lt;br&gt;12参与企业组织进行的投标和合同谈判；&lt;br&gt;13在授权范围内与业主及其它有关单位进行业务洽商，并签署有关文件；&lt;br&gt;14主持项目经理部的全面工作，组织和管理项目施工生产活动；&lt;br&gt;15在授权范围内对项目经理部的人、财、物、技术等资源进行组合与管理。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;生产经理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;项目生产管理协调&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 认真贯彻执行国家的方针、政策以及项目部施工安全生产&lt;a href=&quot;http://www.kfs888.com/guanlizhidu.htm&quot;&gt;管理制度&lt;/a&gt;。&lt;br&gt;2 在项目经理的领导下，负责土建项目的施工管理，对整个项目生产进行组织安排，落实各项工作，向&lt;a href=&quot;http://www.kfs888.com/xiangmu.htm&quot;&gt;项目&lt;/a&gt;经理负责。&lt;br&gt;3 参与编制与下达年、季、月度施工生产计划，并组织实施。&lt;br&gt;4 采取一切措施，确保工程质量和人身安全，杜绝各类事故的发生。&lt;br&gt;5 分管工程管理部，负责组织分包单位和供应商参与工程验交、竣工文件编制与移交、工程验工计价等工作。&lt;br&gt;6 定期向&lt;a href=&quot;http://www.kfs888.com/xiangmu.htm&quot;&gt;项目&lt;/a&gt;经理汇报工作，接受上级业务部门工作检查和职工民主管理监督。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;机电经理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;机电总包管理协调&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 认真贯彻执行国家的方针、政策以及项目部施工安全生产&lt;a href=&quot;http://www.kfs888.com/guanlizhidu.htm&quot;&gt;管理制度&lt;/a&gt;。&lt;br&gt;2 在项目经理的领导下，负责机电项目的施工管理，对机电进行组织安排，落实各项工作，向&lt;a href=&quot;http://www.kfs888.com/xiangmu.htm&quot;&gt;项目&lt;/a&gt;经理负责。&lt;br&gt;3 根据参与编制与下达年、季、月度施工生产计划，并组织实施。采取一切措施，确保工程质量和人身安全，杜绝各类事故的发生。&lt;br&gt;4 分管机电施工部，负责组织分包单位和供应商参与工程验交、竣工文件编制与移交、工程验工计价等工作。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;商务经理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;负责商务合约管理资金财务&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 协助项目经理进行工作，具体负责招投标采购、商务合约管理和项目财务成本管理工作。&lt;br&gt;2 在项目经理的领导下，对施工管理的重要或重大决策进行研究，形成决议，并分别予以落实。&lt;br&gt;3 对分管的工作负责，及时向项目经理汇报工作进展情况，对存在的问题及时解决。负责分包商工作之间的互相协调。主持项目部的财务工作。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;安全经理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;安全总负责&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 直接由公司总部委派，对本工程施工安全具有一票否决权；&lt;br&gt;2 贯彻国家及地方的有关工程安全与文明施工规范，确保本工程总体安全与文明施工目标和阶段安全与文明施工目标的顺利实现；&lt;br&gt;3 负责现场施工环境的管理，对项目绿色施工提出有针对性的意见，监督项目施工过程中环境保护的实施。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;项目总工程师&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;全面技术负责&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 在项目经理领导下，负责&lt;a href=&quot;http://www.kfs888.com/xiangmu.htm&quot;&gt;项目&lt;/a&gt;的全面技术管理工作。&lt;br&gt;主持深化设计文件审核，主持复测、控测及竣工测量，督促并检查技术人员作好技术交底工作。&lt;br&gt;2 负责编制施工组织设计，参与重大方案的制定，审核单项工程施工组织设计。&lt;br&gt;3 负责收集&lt;a href=&quot;http://www.kfs888.com/xiangmu.htm&quot;&gt;项目&lt;/a&gt;的差、错、漏项及不可预见因素引起工程变更方面的有关资料。&lt;br&gt;4 主持并审核施工计划、物资计划、设备、调度、统计、工程报验表的编制。&lt;br&gt;5 负责&lt;a href=&quot;http://www.kfs888.com/xiangmu.htm&quot;&gt;项目&lt;/a&gt;质量计划的贯彻执行，负责项目的整体创优策划和计划的实施。&lt;br&gt;6 负责组织对专业分包项目、直接分包项目重大方案的研讨论证、审核和监督实施。主持工程竣工文件编制。&lt;br&gt;7 按照有关技术规范、规则，解决&lt;a href=&quot;http://www.kfs888.com/xiangmu.htm&quot;&gt;项目&lt;/a&gt;技术问题，&lt;a href=&quot;http://www.kfs888.com/tuiguang.htm&quot;&gt;推广&lt;/a&gt;新技术新材料新设备新工艺的使用。负责收集工程技术资料，组织编制所承担&lt;a href=&quot;http://www.kfs888.com/xiangmu.htm&quot;&gt;项目&lt;/a&gt;的技术总结。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;质量工程师&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;现场质量管理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 负责工程质量的现场监督检查和分部分项工程的质量验收与核定；&lt;br&gt;2 负责一般不合格品的处置，并负责处置后的质量验收与评定；&lt;br&gt;3 发现严重不合格品及时报告项目技术负责人，并负责处置后质量验收与评定；&lt;br&gt;4 按分工做好记录的控制；&lt;br&gt;5 及时沟通有关信息；&lt;br&gt;6 行使现场质量奖惩权；&lt;br&gt;7 项目经理分配的其他职责。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;安全工程师&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;现场安全管理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1组织项目的职业健康安全教育；&lt;br&gt;2 参与项目危险源与环境因素的识别、评价和控制策划；&lt;br&gt;3 负责项目相关职业健康安全法律法规的识别、收集和提供；&lt;br&gt;4 参与项目职业健康安全与环境管理规划、管理方案及技术措施方案的制定，落实相关责任；&lt;br&gt;5 巡回进行职业健康安全检查，发现问题下达整改通知单，并对整改情况进行验证；&lt;br&gt;6 负责职业健康安全应急准备检查，按应急预案进行响应；&lt;br&gt;7 按分工做好记录的控制；&lt;br&gt;8 行使安全生产奖惩权，及时沟通职业健康安全管理体系的有关信息；&lt;br&gt;9 项目经理分配的其他职责。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;土建工程师&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;施工与技术专项管理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1 参与产品实现的策划，协助项目技术负责人编制作业指导书，进行负责专业的技术交底；&lt;br&gt;2按分工做好相关记录的控制；&lt;br&gt;3协助项目经理搞好施工现场的管理；&lt;br&gt;4参与项目危险源与环境因素的管理；&lt;br&gt;5参与管理方案制定，落实职业健康安全与环境管理规划、方案及技术措施方案相关的事项；&lt;br&gt;6 协助项目技术负责人搞好施工过程的设计；&lt;br&gt;7 按分工实施施工过程及其产品的监视和测量；&lt;br&gt;8 按应急预案实施准备和响应；&lt;br&gt;9 参与不合格品及不符合事项的处置；&lt;br&gt;10 参与相关信息分析，协助项目技术负责人制定和实施纠正和预防&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;            </description>
            <pubDate>2026-05-14 05:08:57</pubDate>
            <link>https://www.syuez.com/blog/%E9%81%93%E8%B7%AF%E5%8F%8A%E6%8E%92%E6%B0%B4%E5%B7%A5%E7%A8%8B%E6%8A%80%E6%9C%AF%E6%A0%87%E4%B9%A6.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E9%81%93%E8%B7%AF%E5%8F%8A%E6%8E%92%E6%B0%B4%E5%B7%A5%E7%A8%8B%E6%8A%80%E6%9C%AF%E6%A0%87%E4%B9%A6.html</guid>
                                               <category>招投标</category>
                                    </item>
                <item>
            <title>工程监理投标书</title>
            <description>
            &lt;!--
author: admin
date: 2023-04-05
title: 工程监理投标书
tags: 工程, 监理
category: 招投标
status: publish
summary: 招投标~
--&gt;
&lt;h1&gt;工程监理投标书&lt;/h1&gt;
&lt;h2&gt;目录&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#对工程项目的理解和分析&quot;&gt;一、 对工程项目的理解和分析 3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#工程概况&quot;&gt;1. 工程概况 3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#监理工作范围&quot;&gt;2. 监理工作范围 3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#监理工作目标&quot;&gt;3. 监理工作目标 3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#本工程监理重点与难点分析&quot;&gt;4. 本工程监理重点与难点分析 4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#针对本工程重点难点所采取的监理工作方法与措施&quot;&gt;5. 针对本工程重点、难点所采取的监理工作方法与措施 4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#投资控制的方法及措施&quot;&gt;二、 投资控制的方法及措施 11&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#本工程投资控制的工作任务&quot;&gt;1. 本工程投资控制的工作任务 11&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#投资控制的工作方法&quot;&gt;2. 投资控制的工作方法 11&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#进度控制的方法与措施&quot;&gt;三、 进度控制的方法与措施 13&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#进度控制的工作任务&quot;&gt;1. 进度控制的工作任务 13&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#本工程中拟控制进度目标&quot;&gt;2. 本工程中拟控制进度目标 14&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#进度控制的工作方法&quot;&gt;3. 进度控制的工作方法 17&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#进度控制措施&quot;&gt;4. 进度控制措施 18&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#质量控制的方法与措施&quot;&gt;四、 质量控制的方法与措施 20&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#信息管理的方法与任务&quot;&gt;五、 信息管理的方法与任务 25&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#合同管理&quot;&gt;六、 合同管理 32&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#合同管理的工作任务&quot;&gt;1. 合同管理的工作任务 32&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#合同管理的方法&quot;&gt;2. 合同管理的方法 32&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#合同管理的措施&quot;&gt;3. 合同管理的措施 32&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#监理设施&quot;&gt;七、 监理设施 37&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#常规检测设备工具&quot;&gt;1. 常规检测设备、工具 37&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#设施清单&quot;&gt;2. 设施清单 37&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#监理组织机构及人员配置&quot;&gt;3. 监理组织机构及人员配置 38&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#工程监理的重要部位工序清单&quot;&gt;八、 工程监理的重要部位、工序清单 43&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#旁站监理工作范围施工阶段质量监理&quot;&gt;1. 旁站监理工作范围（施工阶段质量监理） 43&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#旁站监理的工作要求&quot;&gt;2. 旁站监理的工作要求 43&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#旁站监理的主要职责&quot;&gt;3. 旁站监理的主要职责 43&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#旁站监理程序&quot;&gt;4. 旁站监理程序 43&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#旁站监理记录内容&quot;&gt;5. 旁站监理记录内容 44&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#旁站监理要求&quot;&gt;6. 旁站监理要求 44&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#旁站监理要点&quot;&gt;7. 旁站监理要点 45&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#监理工作程序及管理制度&quot;&gt;九、 监理工作程序及管理制度 46&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#监理工作依据&quot;&gt;1. 监理工作依据 46&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#监理原则&quot;&gt;2. 监理原则 46&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#项目监理部内部管理制度&quot;&gt;3. 项目监理部内部管理制度 47&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#监理内部管理方法&quot;&gt;4. 监理内部管理方法 48&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#本工程有关的监理保障措施&quot;&gt;5. 本工程有关的监理保障措施 49&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#组织协调的任务&quot;&gt;6. 组织协调的任务 49&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#组织协调的方法&quot;&gt;7. 组织协调的方法 50&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#组织协调措施&quot;&gt;8. 组织协调措施 51&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#缺陷责任期的监理任务及措施&quot;&gt;9. 缺陷责任期的监理任务及措施 53&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#监理工作制度及廉洁自律措施&quot;&gt;10. 监理工作制度及廉洁自律措施 54&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#向业主提供的监理报告一览表&quot;&gt;11. 向业主提供的监理报告一览表 68&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#合理化建议&quot;&gt;十、 合理化建议 87&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#其他&quot;&gt;十一、 其他 88&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#保证安全施工的监理控制措施&quot;&gt;1. 保证安全施工的监理控制措施 88&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#保证文明施工的监理控制措施&quot;&gt;2. 保证文明施工的监理控制措施 90&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;对工程项目的理解和分析&lt;/h1&gt;
&lt;h2&gt;工程概况&lt;/h2&gt;
&lt;p&gt;工程名称：XXXXXXXXX工程&lt;/p&gt;
&lt;p&gt;建设地点：XXXXX市XXXXX镇东风路、教育路交汇处&lt;/p&gt;
&lt;p&gt;工程规模：本工程建筑占地面积约XXXXXm²，总建筑面积约XXXX万m²，地下X层贯通；地上裙楼X层，主体塔楼：2栋XX层（含裙楼）、2栋XX层（含裙楼）。地下部分面积约XXXXm²，地上部分面积约XXXXm²，其中裙楼商业面积约XXXXm²，塔楼住宅面积约XXXXm²，建筑高度约90米。&lt;/p&gt;
&lt;p&gt;工程预算造价：约XXXXX万元。&lt;/p&gt;
&lt;p&gt;建设单位：XXXX市XXXXXXXX公司&lt;/p&gt;
&lt;p&gt;质量目标：合格&lt;/p&gt;
&lt;h2&gt;监理工作范围&lt;/h2&gt;
&lt;p&gt;监理工作包括工程的设计监理、前期工程、建安工程（土建、给排水、强弱电、通风空调、煤气、消防、各类设备、精装修工程）、所有的配套设施工程（园林、室外市政）、竣工验收阶段（组织竣工验收、竣工资料的整理、送审备案等）和保修阶段的全过程监理。&lt;/p&gt;
&lt;h2&gt;监理工作目标&lt;/h2&gt;
&lt;p&gt;(1) 目标&lt;/p&gt;
&lt;p&gt;实现盈丰·商住中心工程的质量、进度、投资控制在既定的目标范围以内；对合同进行有效的管理；精心组织、精心协调；保障现场安全文明施工，不发生质量、安全事故等。&lt;/p&gt;
&lt;p&gt;(2) 监理工作目标控制承诺&lt;/p&gt;
&lt;p&gt;质量控制目标确保本工程质量合格，争创省、市优良样板工程。按建设单位与承建单位所签定的施工承包合同中对质量的要求进行监控。&lt;/p&gt;
&lt;p&gt;1) 进度控制目标&lt;/p&gt;
&lt;p&gt;工程监理服务期：2004年11月28日工程开工(暂定)至2006年11月28日（730日历天），工程竣工按建设单位与承建单位所签定的施工承包合同中对工期的要求进行监控，力争在730日历天内竣工验收交付使用。&lt;/p&gt;
&lt;p&gt;2) 投资控制目标&lt;/p&gt;
&lt;p&gt;约XXXXX万元人民币，按建设单位与承建单位所签定的施工承包合同中对工程造价的要求进行监控。力争通过提出合理建议和严格监理节省投资。&lt;/p&gt;
&lt;h2&gt;本工程监理重点与难点分析&lt;/h2&gt;
&lt;p&gt;我们在研究监理招标文件及相关工程初步设计图纸后，结合我司类工程的监理经验分析，我司认为本工程要确保项目的工程建设质量、工期、投资、安全文明施工的各项预定目标的全面实现，有以下监理工作重点及难点必须加以解决。&lt;/p&gt;
&lt;p&gt;(1) 本工程有四栋塔楼，其是两栋塔楼为XX层，两栋塔楼为XX层，平面布置较大。地上裙楼为4层，地下室2层贯通。工程占地面积较大，约XXXXXm²。本工程属于大型且高层的项目，所以在工程的平面定位放样及竖向高程控制等方面均有较高的技术含量和较大的工作难度。&lt;/p&gt;
&lt;p&gt;(2) 因未有工程设计图纸，无法定出工程其他的工程特点，待领取工程图纸会，我司会根据图纸内容，分析工程特点，编制详细的《工程监理细则》。&lt;/p&gt;
&lt;h2&gt;针对本工程重点、难点所采取的监理工作方法与措施&lt;/h2&gt;
&lt;p&gt;(1) 本工程中测量控制工作的监理工作方法与措施&lt;/p&gt;
&lt;p&gt;本工程拟建建筑物属于大型且高层建筑设计，均需要有高标准的工程测量监控作保证，方能确保本工程质量目标的完整实现。因此，在本工程测量监控中，监理工程师将根据工程实施的实际情况，做好以下几个方面的测量控制工作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;加强对项目业主所提供的城市座标及水准点的复测，在对承包商所报送的测量控制网进行认真审核的同时，监理工程师将另行分布设本工程的测量控制网（高程及方位坐标网），并达到国家工程建设测量规范所规定的精度要求；在工程实施中与承包商所报测量放样数据进行平行检校，以确保本工程测量控制工作万无一失。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;加强对承包商所上报测量放样数据的检验，并督促承包商对其所使用的测量仪器进行定期检验评定，以确保其所提供的测设数据的准确可靠。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;针对本工程的平面特点，应督促承包商在本工程的外围建立一个闭合的导线及水准测量控制网，以确保在各个方向、各个建设时期均能提供良好的通视条件，确保其测控精度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对本工程中钢筋砼墙面的位置及高程控制，其重要性在本工程中尤为突出。对此，监理工程师将在对承包商所报控制方案的基础上进行全面的复测，并采取对预埋件进行逐个检查和在此处砼浇筑中，进行不间断跟踪旁站监理的工作方法，来确保本工程质量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;对本工程中的大型设备及工程所用的安装管网水平及高程控制问题，将在设备安装工程中做详细安排，此处不做过多论述。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(2) 架空层钢筋砼大面积底板的监理方法及相应措施&lt;/p&gt;
&lt;p&gt;在实施过程中应注意做好以下几点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;应在现场建立计量准确的中心搅拌站，充分保证砼的搅拌质量，砼宜采用泵送方式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;低收缩砼的质量控制应以原材料及施工工艺等入手。如水泥选质量可靠的名牌水泥，砂选中砂以上，碎石选2~4石子中的级配较合理的，再适当掺入瓜米石，使期堆积密度能达到1.6~1.7吨/m³。施工工艺则是选择较大尺寸和大震捣力的平板震动器。在砼初凝、终凝前分别进行压平和收光。收光12小时后，对板面进行蓄水养护。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;尽可能按30m间隔布置后浇带，后浇带封闭时间不少于60天。对后浇带分隔形成的砼分片不允许再留施工缝，后浇带下部垫层应结合设计要求做好防水处理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上下层钢筋网应用马凳筋架立，且面层抗裂钢筋宜选小直径、小间距布置，结合马凳筋布置，同步布置砼厚度标高控制点。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选用外加剂，建议用兼顾泵送、缓凝、引气项能等复合型外加剂。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;本工程底板尽可能采用地胎模，要求回填土碾压后密实度达到92%以上，承台及地梁侧模用24砖墙砌筑并加批荡。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(3) 大面积砼楼板施工中后浇带的监理方法及措施&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;由于后浇带有60天内能释放期方可封闭时间要求，对下道工序要有合理的计划安排，避免对总工期构成影响。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后浇带的砼标号较高且用量不大，同时还掺有膨胀剂，故对配合比、现场搅拌、材料采购、试块制作均要特别注意。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;由于后浇带贯通板和地梁，结其下部垫层面的防水宜采用软性防水材料。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后浇带处的钢筋规格、间距、焊接应完全满足设计要求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;施工后浇带砼时，要准确控制砼的虚铺厚度，使其是终干缩后与两侧地板标高一致。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;由于后浇带有60天停工时间，期间上部照常施工，要用钢板或模板予以覆盖保护，防止污染两侧砼和钢筋。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;对两侧砼的凿毛，监理应对钢筋除锈进行认真检查。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(4) 主体钢筋砼框架施工质量控制的控制方法及相关监理措施&lt;/p&gt;
&lt;p&gt;由于本工程平面尺寸较大，实际工程实施中需进行水平及垂直运输的物料繁多，而现场实际可使用位置较为宽松等特点。监理工程师将在工程实施中采取向业主提出有关改进建议，向承包商提出有关确保质量与安全及进度控制要求等工作方法，以满足主体工程施工质量要求。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;认真审核承包商的塔吊布置方案以满足本工程水平及垂直方向物料运输作业。最大限度地提高设备使用效率，加快工程建设的速度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对主体结构外墙，要具备一定的防水能力，以保证建筑物室内的正常使用。因此，监理工程师将严格要求承包商提供出切实可行的单项施工方案；并严格按照经设计、监理及项目业主确认的方案进行质量控制。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;室内围护结构墙体的监控方法与措施。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在本工程室内围护结构施工中使用加气混凝土块（暂定）。为此，监理工程师将依照在类似工程中所积累的工程监理经验采取以下措施，对此加以最有效的控制：&lt;/p&gt;
&lt;p&gt;有关材料要求如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;应符合广东省和地方建设行政主管部门对墙体的有关规定和国家有关施工验收规范的要求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;砌筑砂浆用的水泥应有产品出厂检验报告，并经合格证送检合格后，方可使用；不同品种水泥，不得混用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;配制砂浆用砂，宜有中砂，并应过筛、不得含草根，废渣等杂物，含泥量＜5%，并不得超标。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本分项工程工序施工中监理控制要点：&lt;/p&gt;
&lt;p&gt;根据本工程建筑及结构设计的特点，在工程实施中应重点加强对以下几个方面的质量监控工作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;门窗洞边200mm内的砌体用大于M5的砂浆或C15细石砼填实砌块孔洞，窗台下设水平钢筋用M10水泥砂浆抹平至设计标高，门窗顶如有砌体，应加设过梁（钢筋砼过梁），若过梁端部与砼柱、墙直接相接，应设角钢支座支承过梁。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;砌体内设置的暗管、暗线、暗盒、洞口、沟槽应考虑避免打洞凿槽，宜采取先施工管线盒等，后批管盒埋入砌体的方法，或采取在填充墙上设钢筋砼柱、梁的方式埋入管线；非不得已需在已砌墙体上开槽，应用专和的镂槽工具或用切割机开槽，禁止人工凿打。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;砌体墙与砼柱应拉结牢固，按柱高度每500（或符合砌块模数）预留2φ6拉结钢筋，伸入墙内＞600。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;砌块堆码高度不超过1.6m，场地平整、不积水，装卸时严禁翻斗倾卸和丢掷，砌筑前按砌块尺寸计算皮数和排数、编制排列图，不得使用龄期不足28天、潮湿、破裂、不规则、表面污染的砌块。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;砌筑时应控制砌块含水率、砼空心砌块为5~8%，加气砼砌块为适当，雨天施工须防止雨水直接冲淋砌体，不得使用被雨水湿透的砌块，墙体材料宜保持均一性，若需镶砌，宜采用与原砌块物理力学性能相近的砼预制块。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;砌筑时清扫墙体下楼面，不得有杂物，并湿润满铺底灰，砌块须错缝砌筑，上下皮搭接长度不宜小于90㎜或砌块长度的1/3，否则在灰缝中设拉结筋（网），铺灰宜用铺灰器，一次铺灰长度不超800，铺灰后立即放砌块，可用木锤敲击摆正，如砌后需移动砌块，须铲除原有砂浆重砌，不得随意撬动已砌好的砌块或打洞凿槽，切锯砌块用专用工具，不得用瓦刀砍劈，否则砌块宜缺梭掉角。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;灰缝应横平竖直，砂浆饱满，水平缝不低于90%，竖缝不低于70%，竖缝宜用内外临时夹板灌缝，严禁干砌再水冲灌缝，边筑边勾缝，不得出现暗缝，严禁有透亮缝，灰缝厚度应均匀，控制在8~12㎜。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;日砌高度控制在1.8m，最上二皮应隔日砌筑，待下部砌体变形沉实稳定后再砌，最上一皮应用辅助实心小砌块（或红砖）45°斜砌挤紧砼梁板底，空隙用砂浆填实，墙体留槎应留斜槎，如留直搓，沿高度600设置2φ6拉结钢筋伸入墙内600，并留成&amp;quot;马牙槎&amp;quot;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(5) 室内装饰工程的监理控制方法及措施。&lt;/p&gt;
&lt;p&gt;根监理工程师将在项目实施中采取下述工作方法来解决以上矛盾：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;严格控制土建工程的各类标高，确保其准确无误，以给装饰工程提供保障。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设备管线的安装时，不仅要有平面布置图，而且还要有准确的剖面图，并尽可能的使管线布置紧揍，节省空间、增加净空，为装饰工程创造良好的条件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;装修施工与主体工程施工有严密的配合，尽可能的避免二个工种之间的矛盾。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;装修设计一定要与灯光、音响设计及时沟通，确保工程的整体使用效果。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(6) 防雷、接地监理控制方法及措施&lt;/p&gt;
&lt;p&gt;防雷接地是国家强检项目，根据设计文件所提供的信息分析，在本工程中我们将注重从桩到梁、柱立筋的通长连接，严格检查焊接工艺，使之与屋面金属结构成为一个整体，并达到设计规定的接地电阻小于1Ω，为防感应雷窜入设备，设备房电源入口处须设置防感应雷装置（电漏保护口），同时严格测试幕墙结构、电动门等，使其均有良好防雷接地。&lt;/p&gt;
&lt;p&gt;监理工作的重点控制对象是：整体通长连接、焊接、跨接体尺寸规格、工艺，确保整体满足设计要求接地电阻小于1Ω。优选主动防雷和防感应雷产品。&lt;/p&gt;
&lt;p&gt;监理工作的控制方法及控制措施有：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;产品质量、价格通过招标方式控制、优选&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建立工序转序会签制度，在土建工程师签发隐蔽验收之前，必须确认有防雷接地工序验收已合格。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;隐蔽前及时验收，保证焊接工艺和尺寸要求，对设备的接地线，使用符合要求的线径。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(7) 消防自动报警系统监理控制的方法及措施&lt;/p&gt;
&lt;p&gt;消防自动报警系统，是国家强检项目，在本工程这样的大型公共建筑中显得更加重要；鉴于国产品牌，虽价格较低，但产品质量不稳定，误动，返修率较高，增加了维护人员的工作强度，误报则干扰正常秩序，建议选用进口产品，以提高其稳定性，使之处于良好的运行状态。&lt;/p&gt;
&lt;p&gt;监理工程师将对以下方面进行重点控制：优选设备。安装质量，调试及验收。&lt;/p&gt;
&lt;p&gt;主要控制方法及措施如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;通过招标优选进口设备，保证产品的稳定性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设备进场确认。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设备安装质量控制、设备调试确认。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;由消防专业部门进行验收，确保设备符合国家强制性标准要求。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(8) 电气照明工种监控方法及措施&lt;/p&gt;
&lt;p&gt;基本控制方法有：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;各种供电器材的选择与使用，均必须符合国家规程规范要求；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;严格安装质量过程控制、严格进行工序质量验收；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;场地照明，建议业主要求请业内权威部门进行测试、验收。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;投资控制的方法及措施&lt;/h1&gt;
&lt;p&gt;根据本工程投资目标和有关建设合同，监理工程师将在确保工程质量的前提下，从多个方面入手，从严控制工程投资，以分项工程投资限额控制目标的实现，来保证工程总体限额投资目标的实现。&lt;/p&gt;
&lt;h2&gt;本工程投资控制的工作任务&lt;/h2&gt;
&lt;p&gt;(1) 要求施工中标单位在获得正式施工图后，及时依据投标时的承诺编制施工图预算。及时审核施工中标单位报审的施工图预算，分析比较与投标承诺的一致性及建筑市场实际价位的相互差别，并向业主报告。使业主对本工程投资有更深入的了解。&lt;/p&gt;
&lt;p&gt;(2) 及时协助业主进行招标工作及甲供设备，材料的招标、采购、验货等工作，及时掌握建筑成本，并及时分析对比投资限额控制的情况，向业主通报。&lt;/p&gt;
&lt;p&gt;(3) 及时预测和分析有可能发生的设计变更或施工单位可能提出的索赔，尽量避免过多的设计变更，及时化解施工单位的索赔苗头。&lt;/p&gt;
&lt;p&gt;(4) 施工过程中及时计量合格工程量，并及时与预算工程量对比，分析实际工程量增、减原因，并及时报告业主。&lt;/p&gt;
&lt;p&gt;(5) 及时审核施工单位上报的有关工程造价文件，并签署监理意见，严格控制可能增加工程造价的经济签证、控制好工程进度款的支付。及时审核施工单位上报的结算文件，并签署监理工程师意见。竣工结算后，及时编制工程造价控制监理报告。&lt;/p&gt;
&lt;h2&gt;投资控制的工作方法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;事前控制&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;熟悉施工承包合同和工程图纸，根据承包合同和进度计划分析项目资金的需求计划并报告业主，预测项目实施过程中投资容易突破的环节和工程部位，并向业主提出建议，以防范风险，尽量避免施工方索赔。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;
&lt;p&gt;事中控制&lt;/p&gt;
&lt;p&gt;(1) 及时答复施工单位的需要由监理单位作出答复的事项，避免造成施工单位对业主的索赔。&lt;/p&gt;
&lt;p&gt;(2) 认真分析工程变更、设计变更对项目经济性的影响，及时与业主沟通。&lt;/p&gt;
&lt;p&gt;(3) 严格经费签证。&lt;/p&gt;
&lt;p&gt;(4) 在质量验收的基础上，及时科学准确进度工程计量，为工程付款提供依据。&lt;/p&gt;
&lt;p&gt;(5) 认真审核承包商提出的支付申请，及时签署监理意见。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;事后控制&lt;/p&gt;
&lt;p&gt;(1) 审核施工单位提交的工程结算书。&lt;/p&gt;
&lt;p&gt;(2) 分析施工单位提出的索赔报告，在授权范围内进行处理。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;进度控制的方法与措施&lt;/h1&gt;
&lt;h2&gt;进度控制的工作任务&lt;/h2&gt;
&lt;p&gt;针对本工程的特点，监理工程师将围绕优质高效这个主题，从以下几个方面来开展卓有成效的监理工作。&lt;/p&gt;
&lt;p&gt;(1) 协助业主早日与中标施工单位签订施工合同，以便明确项目建设方、施工方和监理方的权利和义务，为顺利进入施工准备奠定合同基础。&lt;/p&gt;
&lt;p&gt;(2) 协助业主及时办理好各项施工许可手续。&lt;/p&gt;
&lt;p&gt;(3) 协助业主为施工单位顺利进场创造条件，提供满足需要的临时施工用水、用电接驳点及施工临时设施建造场地。&lt;/p&gt;
&lt;p&gt;(4) 协助业主及时进行城市规划坐标点的确认及与施工单位办理控制坐标点交接手续。&lt;/p&gt;
&lt;p&gt;(5) 及时组织施工图纸的会审工作，使参建各方明确设计技术要求及施工注意事项。&lt;/p&gt;
&lt;p&gt;(6) 及时组织对承包商所报送的施工组织设计进行审核，并提出修改意见。&lt;/p&gt;
&lt;p&gt;(7) 明确施工进度控制各阶段工期目标。&lt;/p&gt;
&lt;p&gt;(8) 督促施工中标单位及时依据已明确的施工图纸、现场施工条件及施工单位的人力安排、机械设备安排、施工材料进场安排等情况，以及监理部对施工组织设计的审核修改意见，重新调整编制出本工程正式的、能指导施工作业的施工组织设计，并及时报监理工程师审核批复。&lt;/p&gt;
&lt;p&gt;(9) 明确规定施工单位组织人力、设备、施工材料的进场日期，并明确处罚条款。&lt;/p&gt;
&lt;p&gt;(10) 及时检查施工单位施工准备进展情况，并向业主通报。如果施工单位施工准备进展缓慢，应及时发文督促施工单位加快施工准备进度。&lt;/p&gt;
&lt;p&gt;(11) 在业主授权情况下及时签发施工开工令，尽可能早的明确施工单位开工计时日期。&lt;/p&gt;
&lt;p&gt;(12) 每日检查施工实际进度，及时与计划进度进行比较，认真分析查找影响施工进度原因，及时提醒施工单位进行动态调整。&lt;/p&gt;
&lt;p&gt;(13) 及时掌握施工情况，需要设计、地质勘探部门及质监部门的配合时，能及时协调处理，确保不因人为因素造成施工受阻。&lt;/p&gt;
&lt;p&gt;(14) 及时进行工序施工质量确认，及时组织材料有见证取样送检和确认、隐蔽验收等质量检查验收工作。&lt;/p&gt;
&lt;p&gt;(15) 及时形成施工期间监理日志，为进度控制形成可追溯资料。&lt;/p&gt;
&lt;h2&gt;本工程中拟控制进度目标&lt;/h2&gt;
&lt;p&gt;(1) 工程施工：自开工之日起730天内各栋主体封顶（本投标文件进度计划暂按2004年11月28日开工计算）&lt;/p&gt;
&lt;p&gt;① 2005.4.28前基础结束&lt;/p&gt;
&lt;p&gt;② 2005.5.10前楼地面混凝土板完成&lt;/p&gt;
&lt;p&gt;③ 2006.5.30前主体封顶&lt;/p&gt;
&lt;p&gt;(2) 外墙装饰：目标2006.11.28外墙结束&lt;/p&gt;
&lt;p&gt;(3) 设备安装：目标2006.11.18设备安装结束&lt;/p&gt;
&lt;p&gt;工期总控制计划见下页&amp;quot;盈丰·商住中心工程进度计划&amp;quot;&lt;/p&gt;
&lt;h2&gt;进度控制的工作方法&lt;/h2&gt;
&lt;p&gt;根据本工程项目业主对进度预定目标，监理工程师将从以下几个方面来对工程进度加以最有效的控制&lt;/p&gt;
&lt;p&gt;(1) 进度事前控制&lt;/p&gt;
&lt;p&gt;1) 预测和分析影响进度计划的可能因素，根据初步分析，本项目要特别注意施工场地的取得时间和现场施工条件准备情况对项目进度可能产生的影响。&lt;/p&gt;
&lt;p&gt;2) 制订控制性进度计划。在总进度目标的约束下，监理单位一业主、承包方一道，制订项目的控制性进度计划。&lt;/p&gt;
&lt;p&gt;3) 审核施工单位提交的施工进度计划和施工方案。根据工程承包合同的工期条款要求，审核进度计划对工期目标的保证程度，施工方案与施工进度计划的协调性和合理性。&lt;/p&gt;
&lt;p&gt;4) 审核施工单位提交的施工总平面图。&lt;/p&gt;
&lt;p&gt;5) 制订根据承包合同约定应由业主采购的材料、设备的采购量和相应的时间参数。&lt;/p&gt;
&lt;p&gt;(2) 进度事中控制&lt;/p&gt;
&lt;p&gt;1) 建立反映工程进度的监理日志。&lt;/p&gt;
&lt;p&gt;2) 检查工程进度计划（含配套的计划）的执行情况，督促施工单位按批准的进度计划执行。&lt;/p&gt;
&lt;p&gt;3) 审核施工单位每月提交的进度计划执行情况报告，对可能存在的差民分析原因。&lt;/p&gt;
&lt;p&gt;4) 组织好现场进度协调会。&lt;/p&gt;
&lt;p&gt;5) 为工程进度款的支付签署进度、计量方面的意见。&lt;/p&gt;
&lt;p&gt;6) 定期向监理单位和业主报告工程进度情况，正常情况下，每周报告一次，出现影响进度的重大事项时，及时通报。&lt;/p&gt;
&lt;p&gt;7) 与业主一道进行进度的动态管理。&lt;/p&gt;
&lt;p&gt;(3) 进度事后控制&lt;/p&gt;
&lt;p&gt;在本工程中，当实际进度计划滞后时，将在分析原因的基础上，提出改进的措施建议，力争保证总工期不突破，涉及到总工期变更或费用增加时，应与业主协商进度计划的变更或费用　补偿问题，进度计划调整后，调整相应的施工、材料、设备和资金供应计划，组织新的平衡和协调。&lt;/p&gt;
&lt;h2&gt;进度控制措施&lt;/h2&gt;
&lt;p&gt;(1) 组织措施&lt;/p&gt;
&lt;p&gt;1) 在总结类似工程监理的基础上组织强有力的监理班子，包括施工、材料选用、设备选型方面的监理工程师，有足够的力量编制合理可行的进度计划控制网络，各分部工程指定专门的进度控制员负责各方面的进度落实。&lt;/p&gt;
&lt;p&gt;2) 做好建设单位的参谋，及时提醒建设单位开展工作。&lt;/p&gt;
&lt;p&gt;3) 核查承建单位管理班子的构成，确保足够的施工管理力量，落实进度保证体系。&lt;/p&gt;
&lt;p&gt;4) 定期和不定期地召开有关协调会，协调各方面的进度。&lt;/p&gt;
&lt;p&gt;5) 妥善处理和核批承建单位的工期索赔。&lt;/p&gt;
&lt;p&gt;6) 协助总承包单位对施工场地实行严格的平面管理。&lt;/p&gt;
&lt;p&gt;7) 定期向建设单位汇报进度情况，及拟采取的措施和建议。&lt;/p&gt;
&lt;p&gt;(2) 技术措施&lt;/p&gt;
&lt;p&gt;1) 结合施工组织设计审查设计方案，并对方案进行优化，使其更有利于加快施工进度。&lt;/p&gt;
&lt;p&gt;2) 协助建设单位提前做好三通一平等进场前的准备工作。&lt;/p&gt;
&lt;p&gt;3) 提前确定测量放线方案，预先建立施工平面控制网和高程控制网。&lt;/p&gt;
&lt;p&gt;4) 及时落实材料、设备使用情况，特别是进口材料和设备的运输、报关、验收等，并将可能出现的困难提前排除。&lt;/p&gt;
&lt;p&gt;5) 制定形象进度计划，将实际进度与其对比，进行动态管理，及时进行调整，对新技术、新方案提前落实、参观学习。&lt;/p&gt;
&lt;p&gt;6) 分施工段作业，监理积极配合，分段验收，全天候监理。&lt;/p&gt;
&lt;p&gt;7) 制定出特殊条件下的施工安全技术措施，比如：抗雨施工，夜间施工及其它赶工措施。&lt;/p&gt;
&lt;p&gt;8) 检查工程进度，落实周计划、月计划、季计划。&lt;/p&gt;
&lt;p&gt;9) 及时组织验收。&lt;/p&gt;
&lt;p&gt;(3) 经济措施&lt;/p&gt;
&lt;p&gt;1) 协助建设单位及时落实资金，及时审核签认工程款支付凭证。&lt;/p&gt;
&lt;p&gt;2) 核查工程款的投向，确保专款专用。&lt;/p&gt;
&lt;p&gt;3) 严格实行设计和施工进度目标奖罚制。&lt;/p&gt;
&lt;p&gt;(4) 合同措施&lt;/p&gt;
&lt;p&gt;1) 制定合同条款时，要有明确的保证进度条款。&lt;/p&gt;
&lt;p&gt;2) 检查各方履行合同的情况，当不按合同规定工期完成任务时，按合同条款及时给予处罚。&lt;/p&gt;
&lt;p&gt;3) 对经过实践检验没胡能力完成任务的施工单位班组，管理人员直到承建单位，建议及时更换。&lt;/p&gt;
&lt;p&gt;4) 按合同条款处理工期索赔。&lt;/p&gt;
&lt;h1&gt;质量控制的方法与措施&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;质量目标：确保合格、创省、市优良样板。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;质量控制任务：确保合格、创省、市优良样板；按建设单位与承建单位签订的施工承包合同中对质量的要求进行监控。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;影响工程质量的原因分析&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;因素&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;影响工程质量的表现形式&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;基本预防措施&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;人员：主要指施工单位的技术主管人员、特殊工种技术工人、一般工种技术工人。&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;①人员素质不高造成工程质量达不到要求；&lt;br&gt;②人员结构不合理造成管理的不到位&lt;br&gt;③人员数量不足，疲劳作业导致质量下降。&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;①对施工单位技术主管人员按投标文件加以核对，特殊工种技术工人要持证上岗，一般工种人员应督促施工单位进行岗前技术交底&lt;br&gt;②施工组织计划应针对工程的实际情况建交组织架构&lt;br&gt;③要求施工单位作出不同阶段的人员计划，并督促其落实&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;材料&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;①不合格材料的使用导致质量不合格&lt;br&gt;②材料管理不善导致质量下降&lt;br&gt;③材料使用不当导致质量问题&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;①制定材料进场检验制度，检查其出厂合格证、准用证等，并按有关要求进行抽检&lt;br&gt;②审核施工单位平面布置图，督促施工单位制定材料管理制度&lt;br&gt;③制定施工交底制度、加强现场巡查，正确使用材料。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;机械&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;①使用不合格的机械导致质量问题&lt;br&gt;②不符合规定的机械使质量达不到要求&lt;br&gt;③不恰当地使用机械使质量达不到要求&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;①施工机械应进行检查合格证后才能使用&lt;br&gt;②加强技术交底工作，根据实际情况使用适当型号的机械&lt;br&gt;③操作前做好技术交底，明确操作要求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;进度&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;进度安排不合理，导致部分工程施工时间要求紧，对质量造成影响&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;审核施工单位的进度安排，要求各阶段的进度做到均衡合理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;投资&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;为节约资金，部分设备，材料采用低标准的品种，质量易产生问题&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;制定选用材料、设备的标准，一般不能降低标准进行选用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;环境&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;①施工场地杂乱，影响工人施工水平，&lt;br&gt;②现场管理混乱，对成品保护不利&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;加强文明施工管理，制定具体的制度与措施&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;
&lt;p&gt;质量控制的主要方法&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;事前控制&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;①审查总承包的技术资质，考察其技术能力管管理经验。&lt;/p&gt;
&lt;p&gt;②熟悉图纸、技术文献，高标准完成设计监理、图纸会审、施工组织设计的审核等技术含量高的工作。&lt;/p&gt;
&lt;p&gt;③编制工程的监理规划、监理细则，设置质量关键控制点&lt;/p&gt;
&lt;p&gt;④建立对原材料、构配件质量的有效监管体系。&lt;/p&gt;
&lt;p&gt;⑤对用于本工程的仪表、设备应通过正规渠道定购，现时在现场应有三方以上共同开箱验收。&lt;/p&gt;
&lt;p&gt;⑥对用于本工程的新材料、新结构、施工新工艺，新技术宜在现场召开专题会议进行风险评估，形成正式报告供业主决策。&lt;/p&gt;
&lt;p&gt;⑦督促、协助承包单位完善质量保证体系和现场质量管理制度。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;事中控制&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;①实行工序质量控制，强化施工方的自检制度及报验程序。&lt;/p&gt;
&lt;p&gt;②设备工序关键质量控制点，特别是对优良工程评定有决定性影响的几大分部的质量控制，要加大旁站、巡视、平行检验、复查的力度。&lt;/p&gt;
&lt;p&gt;③及时进行隐蔽工程验收，对不合格的部位及时发出监理整改通知书，以问题的萌芽状态予以消灭。&lt;/p&gt;
&lt;p&gt;④客观公正地组织对各分部工程的验收和等级评定&lt;/p&gt;
&lt;p&gt;⑤借备案制实施的东风，大胆地行使质量监督和否决权。&lt;/p&gt;
&lt;p&gt;⑥对所掌握和采集的检测数据进行统计分析，观察其离散程序，找出加强质控的方法。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;事后控制&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;①利用初验机会对工程的质量进行一次全面的掌握和全面加强，对须整改的工程应毫不手软的签发整改通知书。&lt;/p&gt;
&lt;p&gt;②审查竣工资料和竣工图纸的完整性及真实性。&lt;/p&gt;
&lt;p&gt;③积极认真协助业主组织工程的竣工验收，全面、公正、准确地编写《工程质量评估报告》及签发负责的验收意见。&lt;/p&gt;
&lt;p&gt;④跟踪落实验收过程中提出的需整改和完善的质量问题。&lt;/p&gt;
&lt;p&gt;⑤对施工中发生的质量事故，应有完善的事故记录及符合程序的处理结果，在验收中予以登记备案。&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;
&lt;p&gt;质量控制的措施&lt;/p&gt;
&lt;p&gt;1) 组织措施&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;a. 派遣有丰富施工监理经验的监理人员，来承担该工程施工阶段的监理工作。&lt;/p&gt;
&lt;p&gt;b. 建立分工明确的监理质量保证体系，分班作业，责任到人，保证全天候监理。&lt;/p&gt;
&lt;p&gt;c. 督促总承包单位建立多层次的质量保证体系，并使这些质量保证体系层次分明，责任到位。&lt;/p&gt;
&lt;p&gt;d. 选择高素质的承建队伍承担专业工程施工任务。&lt;/p&gt;
&lt;p&gt;e. 核查承建单位的质量保证体系，质量管理要层次分明责任到位，奖罚有章，监理单位定期对其作出评估。&lt;/p&gt;
&lt;p&gt;f. 建立进场材料、半成品、设备的报验制度，检查其出厂证、合格证、试验证及准用证，进口设备还需审查其进口报关、商检等手续，确保进场产品的质量。&lt;/p&gt;
&lt;p&gt;g. 制定完善的安全文明施工管理制度，并监督执行。&lt;/p&gt;
&lt;p&gt;1) 技术措施&lt;/p&gt;
&lt;p&gt;a. 协助建设单位搜集新工艺、新材料、新设备的参考资料。&lt;/p&gt;
&lt;p&gt;b. 审查设计标准、设计方案、设备选型是否先进、合理、可靠。&lt;/p&gt;
&lt;p&gt;c. 审查设计方案的施工可行性、便利性、结合旗组织设计给予优化。&lt;/p&gt;
&lt;p&gt;d. 会同设计单位确定施工图的设计原则，方法和步骤。&lt;/p&gt;
&lt;p&gt;e. 检查施工图设计过程中是否符合批准初步设计要求和规范要求。&lt;/p&gt;
&lt;p&gt;f. 核对设计采用的标准、具体设计方案、参数及计算结果。&lt;/p&gt;
&lt;p&gt;g. 核对各种工程图纸的错漏碰缺，保证图纸质量。&lt;/p&gt;
&lt;p&gt;h. 核查图纸设计深度和质量是否符合设计规范要求及设计合同约定。&lt;/p&gt;
&lt;p&gt;i. 认真组织图纸会审，领会设计意图和要求，纠正设计上存在的错漏，结合施工组织设计，与设计协商更改和优化，尽可能地避免今后的设计变更。&lt;/p&gt;
&lt;p&gt;j. 审查施工方案和施工组织设计，保证工程质量具有可靠的安全技术措施。&lt;/p&gt;
&lt;p&gt;k. 对工程中采用的新结构、新工艺、新材料、新技术、新设备、均审核其技术鉴定书，有必要时组织进行参观和学习、试验和优选。&lt;/p&gt;
&lt;p&gt;l. 由专业测量、测绘师核查现场的测量、放线。&lt;/p&gt;
&lt;p&gt;m. 督促承包单位完善计量及质量检测的技术和手段。&lt;/p&gt;
&lt;p&gt;n. 对特别重要的部位、有疑问的检查对象由公司质量检测中心复核。&lt;/p&gt;
&lt;p&gt;o. 核查现场各项准备工作，配合工作完善后，才发布开工令。&lt;/p&gt;
&lt;p&gt;p. 设置工序质量控制点，对重要部位的施工方案进行专题会审，实施跟踪管理。比如：大型构件的施工等。&lt;/p&gt;
&lt;p&gt;q. 以工序质量控制为核心，主动对工序活动的条件加以控制，采用实测分析判断等手段及时检验工序质量。&lt;/p&gt;
&lt;p&gt;r. 严格工序之间的质量检查，坚持验收制度妥善处理质量事故。&lt;/p&gt;
&lt;p&gt;s. 按规定的质量评定标准和办法，及时对分项、分部工程、单位工程进行检查验收，并做好成品保护。&lt;/p&gt;
&lt;p&gt;t. 核查质量验收报告及有关技术文件、竣工图，并及时整理、编制、建档。&lt;/p&gt;
&lt;p&gt;u. 对保修期内发现的工程缺陷进行评价、分析、责成承建单位及时改善。&lt;/p&gt;
&lt;p&gt;1) 经济措施&lt;/p&gt;
&lt;p&gt;a. 及时对工程进度款审核签证，并监督承建单位专款专用。&lt;/p&gt;
&lt;p&gt;b. 建议进行质量评比，对工程质量完成好的单位和个人给予奖励，对差的给予罚款。&lt;/p&gt;
&lt;p&gt;c. 对不合格工程不予签证支付工程款。&lt;/p&gt;
&lt;p&gt;1) 合同措施&lt;/p&gt;
&lt;p&gt;a. 完善施工承包合同中对质量控制的条款。&lt;/p&gt;
&lt;p&gt;b. 按施工承包合同条款行使质量否认权和确认权，对不合格工程要求必须返工。对没有能力按质按期完成工程任务的单位及个人，严禁进场施工。&lt;/p&gt;
&lt;p&gt;c. 严格执行施工承包合同规定的奖罚条款。&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;质量控制有关程序详见本方案&amp;quot;监理工作流程图&amp;quot;一章节。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;信息管理的方法与任务&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;信息管理的任务&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;信息管理的人是收集、整理、存储、传递和应用各种工程项目实施中的信息、文字、数据等资料，及时准确地向各项目的各级管理人员、各个参与项目建设的单位及其它有关部门提供他们所需要的信息，对项目实施进行动态控制，迅速准确的进行分类决策，分析问题产生原因，为项目总目标的控制任务服务。在本工程中监理工程师将建立有效的畔管理组织、程序和方法，及时把握有关项目以外、计划和实际的信息，为有效进行监理服务。同时，通过畔管理，为业主权益服务，其主要工作内容有：&lt;/p&gt;
&lt;p&gt;(1) 及时与业主沟通信息，使业主了解项目进展情况。&lt;/p&gt;
&lt;p&gt;(2) 定期向业主书面报告（监理月报）项目三大目标的执行情况。&lt;/p&gt;
&lt;p&gt;(3) 工程建设中出现的影响项目目标的问题，及时通过信息传递，报告业主。&lt;/p&gt;
&lt;p&gt;(4) 超过合同约定的各种变更，均应得到业主的批准指令。&lt;/p&gt;
&lt;p&gt;(5) 本工程监理过程中，可能影响项目目标的重大监理指令（如停工指令、复工指令、重大质量问题整改通知等），在非紧急情况下，事先尽可能与业主协商。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;
&lt;p&gt;工作方法有：&lt;/p&gt;
&lt;p&gt;(1) 监理记录报告与档案&lt;/p&gt;
&lt;p&gt;1) 监理记录&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;监理记录是监理工程师和监理人员重要日常工作之一，它也是监理工作的写真。因此，必须认真填写做好详细的记录，主要分两个方面，一是监理记录，二是原始记录，其主要内容分述如下：&lt;/p&gt;
&lt;p&gt;监理记录的内容：&lt;/p&gt;
&lt;p&gt;a. 监理工程师在实施监理过程中，应按照有关要求认真填写并做好对各分项工程的批准开工，检验和材料试验结果记录，特别是重要部位或隐蔽工程检验记录及隐蔽工程照片、录像的妥善保存。&lt;/p&gt;
&lt;p&gt;b. 《工程分项分部开工申请批复单》：监理工程师对应承包人提交的施工方案、施工图纸、使用材料、测量放线、水准点、检测设备等审查合同后批准开工申请批复单。&lt;/p&gt;
&lt;p&gt;c. 《承包人每周工作计划》：监理工程师应掌握承包人每周工作计划，以便进行监理工作。&lt;/p&gt;
&lt;p&gt;d. 《监理日报》：现场监理人员应按监理日报表内容填写，并由监理工程师保存，做为监理工程师发出指示解决索赔，延期的重要依据。&lt;/p&gt;
&lt;p&gt;e. 《检验申请批复单》：监理工程师应对承包人完成每一分项工程后填报的检验申请批复单进行检验，签认合格后，承包人方能进行下道工序施工，并可做为支付依据，填写《中间计量表》。&lt;/p&gt;
&lt;p&gt;f. 《工作指令》：监理工程师应根据现场检验工程质量等问题向承包人下达指令，要求承包人按照规范纠正质量缺陷或停止施工，工作指示同时报上级监理部门。&lt;/p&gt;
&lt;p&gt;g. 《工程变理令》：监理工程师应根据已批准的变更申请单，填报工程变更令，做为计量支付的依据。&lt;/p&gt;
&lt;p&gt;h. 《工地会议纪要》：工地会议由监理工程师主持，宜每月召开一次，有关工程师和承包单位负责人、地方政府有关人员参加。纪要由监理工程师签字后，分送有关单位，并报上级监理部门一份。&lt;/p&gt;
&lt;p&gt;1) 原始记录的主要内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  a. 现场监理人员应按合同或规范对承包人提交的质量检验报告单认真审核并签认后报监理工程师备查。

  b. 现场监理人员应对材料试验全过程进行旁站监理，重要部分和抽检试验应由现场监理人员或中收实验室操作完成，其试验结果送监理工程师确认。&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2) 工程监理月报&lt;/p&gt;
&lt;p&gt;驻地场埋工程师应根据工程进展情况、存在的问题每月以报告书的格式向业主和总监办报告。月报所陈述的问题仅指已存在的或将对工程费用、质量及工期产生实质性影响的事件，报告使业主及总监办能对工程现状有一个比较清晰的了解。报告书中对进度原定计划落后的分项工程和细目，应说明延迟的原因以及为挽回这种书面已采取或将要采取的措施。月报还应报告承包人主要职员和监理工程师职员的变动情况，已完成的主要工程分项和细目等。&lt;/p&gt;
&lt;p&gt;工程监理月报的主要内容：&lt;/p&gt;
&lt;p&gt;工程描述：工程监理月报的正文前应附有一张工程位置图，图中应清晰地表明工程的具体位置。&lt;/p&gt;
&lt;p&gt;工程描述通常是简短叙述合同的内容，第一份监理月报的工程描述应详细提供以下资料，后期的月报可视情况适当进行增减。&lt;/p&gt;
&lt;p&gt;a. 项目名称、合同号；&lt;/p&gt;
&lt;p&gt;b. 地理位置；&lt;/p&gt;
&lt;p&gt;c. 合同工作范围内的主要地质构成；&lt;/p&gt;
&lt;p&gt;d. 主要工程数量；&lt;/p&gt;
&lt;p&gt;e. 合同签订日期；&lt;/p&gt;
&lt;p&gt;f. 承包人或联营体的名称及项目负责人；&lt;/p&gt;
&lt;p&gt;g. 合同造价；&lt;/p&gt;
&lt;p&gt;h. 合同规定的工期；&lt;/p&gt;
&lt;p&gt;i. 开工通知书发出日期及开工日期；&lt;/p&gt;
&lt;p&gt;j. 修订的完工期（以后如有变动，可以修订）；&lt;/p&gt;
&lt;p&gt;k. 从开工到现场已过去的施工时间；&lt;/p&gt;
&lt;p&gt;l. 本月内的气象报告。&lt;/p&gt;
&lt;p&gt;1) 认可的分包人及供应人&lt;/p&gt;
&lt;p&gt;内容一般应包括分包工程的哪一部分、劳务、运输、材料、为工程提供的服务等。对于工程材料、设备等的供应人情况在月报中应作一简单说明。&lt;/p&gt;
&lt;p&gt;2) 工程质量&lt;/p&gt;
&lt;p&gt;根据合同要求，不符合技术规范规定的工程质量均不得计量和交验，月报表中可就现场各个工程分项的材料、机械、人员配备实际情况结合工程质量的检验、量测结果作综合评价。&lt;/p&gt;
&lt;p&gt;3) 工程进度&lt;/p&gt;
&lt;p&gt;应提供工程总体进度及每个主要工程分项的实际进度和计划进度。&lt;/p&gt;
&lt;p&gt;a. 总体进度&lt;/p&gt;
&lt;p&gt;监理工程师应统计确定总体进度。月报的实际进度与计划进度进行比较，确定完成计划的百分率，并根据总体进度的实际情况说明影响总体进度的因素以及已采取或将要采取的措施。&lt;/p&gt;
&lt;p&gt;b. 主要工程项目的进度监理工程师根据计量结果，确定主要工程项目的实际进度，然后再与计划进度比较，确定迄今完成的百分率，找出影响工程进度的因素，应说明主要工程项目延误的原因，已采取的措施和效果或将要采取的措施。&lt;/p&gt;
&lt;p&gt;c. 其它工作&lt;/p&gt;
&lt;p&gt;其它工作应包括规范中一般条目所列的工作、临时工程等完成情况及与计划的对比情况，以及料场的建设情况、生产能力、质量及已生产的各类成品数量。&lt;/p&gt;
&lt;p&gt;1) 支付状况&lt;/p&gt;
&lt;p&gt;本期支付的情况，累计支付的情况、暂定金额、价格调整、费用索赔等。&lt;/p&gt;
&lt;p&gt;2) 监理工作执行情况&lt;/p&gt;
&lt;p&gt;本部分内容主要描述监理工作的情况，还应包括各类监理人员的人数、工作安排及监理工程师的办公室、住房、设施和车辆等的现状和存在问题以及对工程的影响。&lt;/p&gt;
&lt;p&gt;3) 小结&lt;/p&gt;
&lt;p&gt;概略评述有关承包人履行合同义务的表现、存在的问题、采取的改进措施和今后工作安排的设想等。&lt;/p&gt;
&lt;p&gt;4) 工程监理报告&lt;/p&gt;
&lt;p&gt;在工程结束后，驻地监理工程师应提交监理工作报告，报业主和总监办，报告内容一般为：&lt;/p&gt;
&lt;p&gt;工程基本概况；&lt;/p&gt;
&lt;p&gt;监理组织机械及工作起、止时间；&lt;/p&gt;
&lt;p&gt;关于工程质量、工程进度、工程费用及合同管理的执行情况；分项、分部、单位工程质量评估；&lt;/p&gt;
&lt;p&gt;工程费用分析；&lt;/p&gt;
&lt;p&gt;对工程建设中存在问题的处理意见和建议。&lt;/p&gt;
&lt;p&gt;照片或录像。&lt;/p&gt;
&lt;p&gt;5) 监理档案&lt;/p&gt;
&lt;p&gt;驻地监理工程师与业主、承包人或指定分包人之间有关工程质量、进度和费用的一些往来函件和报表均应分类编号归档保存，监理工程师应督促承包人在合同规定时间内，向业主提交完整、准确、清晰的竣工图纸、资料和各类档案。档案一般分为：行政档案、计量（支付）档案和技术档案。&lt;/p&gt;
&lt;p&gt;行政档案内容：&lt;/p&gt;
&lt;p&gt;监理工程师与业主之间往来的函件；&lt;/p&gt;
&lt;p&gt;监理工程师与承包人或指定分包人之间往来的函件、书面协议、申请批复、会议记录；&lt;/p&gt;
&lt;p&gt;监理工程师与技术专家之间往来的函件；&lt;/p&gt;
&lt;p&gt;监理机构内部来往的函件、请示报告、报告的批复；&lt;/p&gt;
&lt;p&gt;监理工程师与第三方之间的来往函件、协议；&lt;/p&gt;
&lt;p&gt;工程监理月报。&lt;/p&gt;
&lt;p&gt;计量（支付）档案内容：&lt;/p&gt;
&lt;p&gt;承包人提出的延期索赔申请以及批推的延期单位和索赔的费用；&lt;/p&gt;
&lt;p&gt;承包人提出的价格调整申请以及批准的价格调整指数；&lt;/p&gt;
&lt;p&gt;额外或紧急工程的费用计算；&lt;/p&gt;
&lt;p&gt;各类支付证书；&lt;/p&gt;
&lt;p&gt;保险单及付款收据；&lt;/p&gt;
&lt;p&gt;其它的费用支付证明；&lt;/p&gt;
&lt;p&gt;工程进度月报；&lt;/p&gt;
&lt;p&gt;技术档案内容；&lt;/p&gt;
&lt;p&gt;开工及停工指令；&lt;/p&gt;
&lt;p&gt;现场指令；&lt;/p&gt;
&lt;p&gt;检查记录；&lt;/p&gt;
&lt;p&gt;试验记录。&lt;/p&gt;
&lt;p&gt;项目监理部文件资料编号系统&lt;/p&gt;
&lt;p&gt;[行政管理、法规性文件] G-1中央部委、协会文件 G-2地方政府、协会文件 G-3公司文件 G-4技术标准有效版本目录&lt;/p&gt;
&lt;p&gt;[工程项目文件] X-1勘察设计文件（不含图纸） X-2设计承包合同、协议 X-3施工承包合同、协议 X-4建设监理合同、协议 X-5加要订货合同、协议 X-6项目建设其它文件&lt;/p&gt;
&lt;p&gt;[质量、工期、造价控制资料] K-1分承包方资质审查材料 K-2承包方（含分承包）技术员工资格资料 K-3设计交底资料 K-4工程动工资料 K-5施工组织设计（施工方案）报审资料 K-6施工承包方（含分承包方）进度计划 K-7施工测量放线资料 K-8砖、混凝土质保资料 K-9钢材、木材质保资料 K-10防水、保温材料质保资料 K-11给排水、煤气材料、设备质保资料 K-12暖通、空调材料、设备质保资料 K-13强电、弱电材料、设备质保资料 K-14门、窗等建筑构配件质保资料 K-15建筑装饰材料质保资料 K-16试验室资质和检测设备检定资料 K-17监理复试资料 K-18工程洽商与设计变更资料（建筑、结构、装饰） K-19工程洽商与设计变更资料（给排水、煤气） K-20工程洽商与设计变更资料（暖通、空调） K-21工程洽商与设计变更资料（强电、弱电） K-22工程量计量与工程款支付资料（合同内、外） K-23工、料、机动态月报资料 K-24监理通知、指令、备忘录 K-25建设单位指示、指令 K-26质量问题处理资料 K-27监理例会、协调会纪要 K-28公司领导巡检记录 K-29监理工作总结 K-30质检站检查资料 K-31其它&amp;quot;三控&amp;quot;有关资料&lt;/p&gt;
&lt;p&gt;[工程验收资料] Y-1分部分项工程验收资料（地基与基础工程） Y-2分部分项工程验收资料（地主工程） Y-3分部分项工程验收资料（屋面工程） Y-4分部分项工程验收资料（门窗工程） Y-5分部分项工程验收资料（地面与楼地面工程） Y-6分部分项工程验收资料（给排水与煤气工程） Y-8分部分项工程验收资料（电气安装工程） Y-9分部分项工程验收资料（装饰工程） Y-11竣工验收资料 Y-12其它验收资料&lt;/p&gt;
&lt;p&gt;项目监理部文件资料编号系统结构图&lt;/p&gt;
&lt;h1&gt;合同管理&lt;/h1&gt;
&lt;h2&gt;合同管理的工作任务&lt;/h2&gt;
&lt;p&gt;合同管理的任务是：根据项目业主与承包商所签订的工程承包合同相关条款，对照工程实施中的相应事项：&lt;/p&gt;
&lt;p&gt;(1) 工程的开工、停工、复工&lt;/p&gt;
&lt;p&gt;(2) 工程变更&lt;/p&gt;
&lt;p&gt;(3) 工程工期延误&lt;/p&gt;
&lt;p&gt;(4) 费用索赔&lt;/p&gt;
&lt;p&gt;(5) 争端与仲裁&lt;/p&gt;
&lt;p&gt;(6) 违约的处罚&lt;/p&gt;
&lt;p&gt;(7) 分包、转让与指定分包&lt;/p&gt;
&lt;p&gt;(8) 工程的保险等有关事项进行监督、调查与处理。&lt;/p&gt;
&lt;h2&gt;合同管理的方法&lt;/h2&gt;
&lt;p&gt;在工程项目中，监理工程师采取以下工作方法开展工程合同管理工作：&lt;/p&gt;
&lt;p&gt;(1) 工程实施中根据合同的有关条款进行跟踪检查与对比；&lt;/p&gt;
&lt;p&gt;(2) 通过约请承包人项目经理或法人代表，项目业主协商谈判的方式对工程实施中的争议进行调解，以最大限度的化解矛盾，在既维护项目业主的利益又最大限度的保护承包商合法权益的前提下开展有关协调工作，使工程建设得以顺利进行；&lt;/p&gt;
&lt;p&gt;(3) 严格按合同约定以公正的第三方身份妥善处理有关合同争议；必要时诚实的向有关方面作证，以公正的解决争端。&lt;/p&gt;
&lt;h2&gt;合同管理的措施&lt;/h2&gt;
&lt;p&gt;(1) 合同管理监理&lt;/p&gt;
&lt;p&gt;1) 合同管理的任务&lt;/p&gt;
&lt;p&gt;采取预先分析及调查的方法，经常跟踪合同的执行情况和施工中的问题，及时通过下发监理通知等监理手段督促和纠正承包商不符合合同约定的行为和提前向建设单位和承包商发出预示，防止偏离合同约定事件的发生。其工作内容主要包括以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;协助业主分析合同条款，订立合同，避免合同签定以后造成被动。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;熟悉业主与有关单位订立的合同，以便检查、督促有关方面严格执行合同。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;协助业主处理合同执行中存在或出现的问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;及时向业主报告合同的执行情况。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程变更的审查。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;索赔的审核与签认。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程分包与业主指定分包。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;反索赔证据的收集与整理。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(2) 主要工作方法&lt;/p&gt;
&lt;p&gt;1) 工程变更&lt;/p&gt;
&lt;p&gt;监理工程师对工程中任何形式、质量、数量和内容上的变动，根据合同有关规定进行审核，并报业主审批后发布工程变更令，在与业主和承包人协调商量后，确定变更工程的单位和费率。&lt;/p&gt;
&lt;p&gt;A. 工程变更的提出&lt;/p&gt;
&lt;p&gt;工程变更可由承包人提出，也可由业主或监理工程师提出，承包人提出的工程变更，多数是从方便承包人施工条件出发，业主提出变更多数是由于当地政府的要求，或者是工程使用性质改变，监理工程师提出变更多数是发现设计中的不足或错误，无论那方提出变更，都需要提出变更原因、设计图纸和有增减工程量，影响工程费用的计算书。&lt;/p&gt;
&lt;p&gt;B. 工程变更的程序&lt;/p&gt;
&lt;p&gt;工程变更提出后，经监理工程师审查（成审查过程中，依据工程变更的性质和变更费用多少，必要时与业主或承包人协商），工程变更审查批准后，编制变更文件，发出变更指示。由承包人在工程施工中执行变更指令，业主依据工程变更增减工程费用。&lt;/p&gt;
&lt;p&gt;C. 工程变更的管理&lt;/p&gt;
&lt;p&gt;按照工程监理管理体制，工程变更的管理是通过二级完成的，即驻地监理工程师和总监理工程师二级管理。&lt;/p&gt;
&lt;p&gt;作为专业监理工程师这级管理，无论变更来源于何方、一旦得到信息，即应着手进行有关变更资料的收集和加强现场监督管理，以便当业主或总监理工程师下达书面变更意向通知后，能够尽快的提交给总监理工程师一份完整的、准确的反映状况的资料，为总监理工程师下一步评估变更对费用　带来的影响及颁发工程变更令奠定基础。&lt;/p&gt;
&lt;p&gt;专业监理工程师应注意整理收集反映工程状况的资料，包括：变更前后的设计文件、资料、图纸，有关方面的意见，信函；业主、承包人、监理工程师之间来往的信函，会议记录，上级主管部门以及政府有关部门的来往信函，工程变更前后该工程数量，承包人工、料、机配备以及现场条件变化的情况，并依据这些资料评估变更费用。对承包人提供的变更工程量清单要认真审核、确认无误后方可决定采用何种单价和标准。&lt;/p&gt;
&lt;p&gt;D. 变更工程的单价确定的原则&lt;/p&gt;
&lt;p&gt;a. 如果工程师量清单的单价或价格适宜，就应用于变更工程项目、&lt;/p&gt;
&lt;p&gt;b. 如果工程量清单没有适合于变更工程的单价或价格，则由业主和承包人一起协商单价或价格，意见不一致时，由监理工程师进行最终确定。&lt;/p&gt;
&lt;p&gt;c. 当工程变更规模超过合同规定的某个范围时，则单价或合同价格应予以调整。&lt;/p&gt;
&lt;p&gt;第a条和第b条是处理工程变更最常用的办法。第b条在实际使用中要慎重，因为合同条款中未就超过范围后如何调整价格规定模式，否则就会带来很严重的后果，甚至可能使工程造价失控。&lt;/p&gt;
&lt;p&gt;当承包人、业主对变更费用意见达成一致时，或经过多次磋商始终不统一，而要由监理工程师决定时，即可进行工程变更的编制。&lt;/p&gt;
&lt;p&gt;E. 一份完整的工程变更令应由下述文件组成：&lt;/p&gt;
&lt;p&gt;a. 工程变更令目录，列明所有与之有关的文件资料，并成为有序排列。&lt;/p&gt;
&lt;p&gt;b. 工程变更令。有监理工程师、业主、承包人认可的亲笔签字。&lt;/p&gt;
&lt;p&gt;c. 工程变更令说明。作为工程变更令的重要附件，主要阐明变更原因及变更费用确定的原则。&lt;/p&gt;
&lt;p&gt;d. 变更费用一览表。作为工程变更令的另一个重要附件，反映茖变更前后的数量及费用变化情况。&lt;/p&gt;
&lt;p&gt;e. 其它。即除b、d外，a中所列的文件资料也属茖变更令的附件。例如，业主、承包人、监理工程师之间来往的信件，图纸，会议纪要，驻地办的证明等。&lt;/p&gt;
&lt;p&gt;2) 保险&lt;/p&gt;
&lt;p&gt;对承包人的保险种类、范围、数额、时间、有效期、保险单有保险收据进行检查，以确保各种保险的落实。&lt;/p&gt;
&lt;p&gt;3) 争端与仲裁&lt;/p&gt;
&lt;p&gt;当工程发生争议时，监理工程师根据合同规定的期限，进行争议事件的全面调查，取证，并对争议做出书面决定，通知业主和承包人。若业主和承包人不同意监理工程师做出的决定，可提交有关部门进行仲裁。&lt;/p&gt;
&lt;p&gt;4) 违约&lt;/p&gt;
&lt;p&gt;A. 监理工程师对业主违约进行确认并按合同规定进行处理，依据的事实主要为：&lt;/p&gt;
&lt;p&gt;a. 宣告破产，或作为一个公司宣告停业整顿，但清理不是为了改组或合并。&lt;/p&gt;
&lt;p&gt;b. 由于不可预见的理由，而不可能继续履行其合同义务。&lt;/p&gt;
&lt;p&gt;c. 没有在规定的合理时间内根据监理工程师支付证书向承包人付款或干涉，阻挠、拒绝支付证书的颁发。&lt;/p&gt;
&lt;p&gt;d. 未经监理工程师同意，随意分包工程或将整个工程分包出去。&lt;/p&gt;
&lt;p&gt;B. 违约处理&lt;/p&gt;
&lt;p&gt;在本工程中监理工程师对承包人违约行为，将依据下列事实进行确认，并根据合同规定进行处理。&lt;/p&gt;
&lt;p&gt;a. 无力偿还债务，或陷入破产，或主要财产被接管，或主要资产被抵押，或停业整顿等，因而放弃合同。&lt;/p&gt;
&lt;p&gt;b. 无正当理由不开工或拖延工期。&lt;/p&gt;
&lt;p&gt;c. 无视监理工程师的警告，一贯公然忽视男合同规定的责任和义务。&lt;/p&gt;
&lt;p&gt;d. 未经监理工程师同意，随意分包工程或将整个工程分包出去。&lt;/p&gt;
&lt;h1&gt;监理设施&lt;/h1&gt;
&lt;h2&gt;常规检测设备、工具&lt;/h2&gt;
&lt;p&gt;根据本工程的情况和招标文件的要求，我司拟为本项目监理部配备下表所列的设备：&lt;/p&gt;
&lt;h2&gt;拟投入本项目主要检测仪器一览表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;设备名称&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;规格型号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;单位&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;数量&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;备注(设备价值：元)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;光学经纬仪&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;TDJ2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;台&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10,600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;自动安平水准仪&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;WILDNA2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;台&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;30cm钢直尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;把&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3m钢卷尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;把&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;30m钢卷尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;把&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;240&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;靠尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;把&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2,250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;线锤&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;个&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;三米直尺&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;把&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;砼拌和物坍落度试验仪&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;套&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;数码摄像机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;进口&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;台&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;11&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;电脑配打印设备&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;联想&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;套&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;14,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;手提电话&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;诺基亚&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;台&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;9,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;13&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;传真电话&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;TCL&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;台&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1,800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;总计&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;53,380&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;设施清单&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;名称&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;单位&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;数量&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;办公室&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;间&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设单位免费提供&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;值班住房&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;间&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设单位免费提供&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;办公桌椅&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;套&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设单位免费提供&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;床位&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;个&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;建设单位免费提供&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;监理组织机构及人员配置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;拟委派本项目驻场监理机构人员的各职能分工架构图&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;盈丰·商住中心工程项目监理组&lt;/p&gt;
&lt;p&gt;盈丰·商住中心工程项目&lt;/p&gt;
&lt;p&gt;公司总工程师室&lt;/p&gt;
&lt;p&gt;实施监理&lt;/p&gt;
&lt;p&gt;实施监理&lt;/p&gt;
&lt;p&gt;技术巡视监控&lt;/p&gt;
&lt;p&gt;总监&lt;/p&gt;
&lt;p&gt;总监代表&lt;/p&gt;
&lt;p&gt;资料员&lt;/p&gt;
&lt;p&gt;装饰监理员&lt;/p&gt;
&lt;p&gt;园林绿化监理员&lt;/p&gt;
&lt;p&gt;土建监理员&lt;/p&gt;
&lt;p&gt;给排水监理员&lt;/p&gt;
&lt;p&gt;电气监理员&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;配置的人员表&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;总监(1人)；&lt;/p&gt;
&lt;p&gt;总监代表（1人）；&lt;/p&gt;
&lt;p&gt;土建监理员(3人)；&lt;/p&gt;
&lt;p&gt;给排水监理员(1人)；&lt;/p&gt;
&lt;p&gt;电气安装监理员(1人)；&lt;/p&gt;
&lt;p&gt;装饰监理员(2人)；&lt;/p&gt;
&lt;p&gt;园林绿化监理员（1人）；&lt;/p&gt;
&lt;p&gt;资料员（1人）。&lt;/p&gt;
&lt;p&gt;此部分人员的相关资料见&amp;quot;公司简介&amp;quot;一部分内容。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;监理工程师的工作内容、职责、分工&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;专业监理工程师&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;分工&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;工作内容&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;职责&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;土建专业监理工程师&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;本工程主体结构土建工程质量、进度、安全、文明施工现场监督与管理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;原材料质量控制、施工图纸及技术文件的审查、施工工序的质量控制，工程分部、分项的验收评定。工程计量工作中有关工程量的签认&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;对土建主体结构工程质量、进度、安全、文明施工进行控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;装修专业监理工程师&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;本工程室内、外装修（包括玻璃幕墙）工程的监理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;室外装修、外墙装修、玻璃幕墙工程的原材料、设计图纸、施工技术方案、及与此有关的安全及文明施工管理和工程量的确认&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;确保所监理的装修工程质量、进度在受控状态之下，不发生伤亡事故。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;设备及安装专业监理工程师&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;本工程中各项设备的安装工程监理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;给排水、电气、消防等设备的安装及其调试，安全施工与文明施工&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;确保本工程中设备及安装工程的质量、进度控制在总工程进度控制目标以内，确保施工安全无重大安全事故，确保本工程创文明施工市级样板工地。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;造价专业监理工程师&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;本工程投资控制的监理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;办理各项预算、结算、及中期支付，编制项目竣工决算报告，审查各项工程变更的合理性，防止索赔事件的发生，当索赔事件发生后及时收集有关证据，及时对索赔事件进行有效的处理，使索赔金额控制在最小范围之内。&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;结合本工程的进度对工程投资进行控制，确保工程最终投资控制在业主所预定的投资控制目标以内&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;合同信息监理工程师&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;对本工程有关的合同、信息进行管理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;对工程合同、资料、信息进行及时有效的传递，确保信息流畅通无阻，充分收集和利用信息为本工程建设服务。&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;保证本工程的合同、资料、信息的完整、有效，保证本工程的有关资料保密。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;明确监理人员岗位职责&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(1) 总监理工程师岗位职责&lt;/p&gt;
&lt;p&gt;确定项目监理机构人员的分工和岗位职责；&lt;/p&gt;
&lt;p&gt;主持编写项目《监理规划》、审批项目监理实施细则，并负责管理项目监理机构的日常工作；&lt;/p&gt;
&lt;p&gt;检查和监督监理人员的工作，根据工程项目的进度情况可进行人员调配，对不称职的人员应调换其工作；&lt;/p&gt;
&lt;p&gt;主持监理工作会议，签发项目监理机构的文件指令；&lt;/p&gt;
&lt;p&gt;审定承包单位提交的开工报告、施工组织设计、技术方案、进度计划；&lt;/p&gt;
&lt;p&gt;审核签署承包单位的申请、支付证书和竣工结算；&lt;/p&gt;
&lt;p&gt;审查和处理工程变更；&lt;/p&gt;
&lt;p&gt;主持或参与工程质量事故的调查；&lt;/p&gt;
&lt;p&gt;调解建设单位与承包单位的合同争议、处理索赔、审批工程延期；&lt;/p&gt;
&lt;p&gt;组织编写并签发监理月报、监理工作阶段报告、专题报告和项目监理工作总结；&lt;/p&gt;
&lt;p&gt;审核签认分部工程和单位工程的质量检验评定资料，审查承包单位的竣工申请，组织监理人员对待验收的工程项目进行质量检查，参与工程项目的竣工验收；&lt;/p&gt;
&lt;p&gt;主持整理工程项目的监理资料。&lt;/p&gt;
&lt;p&gt;(2) 总监代表岗位职责&lt;/p&gt;
&lt;p&gt;负责总监理工程师指定或交办的监理工作；&lt;/p&gt;
&lt;p&gt;按总监理工程师的授权，行使总监理工程师的部分职责和权力。&lt;/p&gt;
&lt;p&gt;各监理专业监理工程师岗位职责&lt;/p&gt;
&lt;p&gt;负责编制本专业的《监理实施细则》；&lt;/p&gt;
&lt;p&gt;负责本专业监理工作的具体实施；&lt;/p&gt;
&lt;p&gt;组织、指导、检查和监督本专业监理员的工作，当人员需要调整时，向总监理工程师提出建议；&lt;/p&gt;
&lt;p&gt;审查承包单位提交的涉及本专业的计划、方案、申请、变更，并向总监理工程师提出报告；&lt;/p&gt;
&lt;p&gt;负责本专业分项工程验收及隐蔽工程验收；&lt;/p&gt;
&lt;p&gt;定期向总监理工程师提交本专业监理工作实施情况报告，对重大问题及时向总监理工程师汇报和请示；&lt;/p&gt;
&lt;p&gt;根据本专业监理工作实施情况做好监理日记；&lt;/p&gt;
&lt;p&gt;负责本专业监理资料的收集、汇总及整理，参与编写监理月报；&lt;/p&gt;
&lt;p&gt;核查进场材料、设备、构配件的原始凭证、检测报告等质量证明文件及其质量情况，根据实际情况有必要时对进场的材料、设备、构配件进行平行检验，合格时予以签认；&lt;/p&gt;
&lt;p&gt;负责本专业的工程计量工作，审核工程计量的数据和原始凭证。&lt;/p&gt;
&lt;p&gt;(3) 各监理级监理员岗位职责&lt;/p&gt;
&lt;p&gt;监理员从事直接的工程检查、计量、检测、检验、监督和跟踪工作，他们行使检查和发现问题的职能。&lt;/p&gt;
&lt;p&gt;监理员的任务一般有如下几方面：&lt;/p&gt;
&lt;p&gt;在专业监理工程师的指导下开展现场监理工作；&lt;/p&gt;
&lt;p&gt;检查承包单位投入工程项目的人力、材料、主要设备及其使用、运行情况，并做好检查记录；&lt;/p&gt;
&lt;p&gt;复核或从施工现场直接获取工程计量的有关数据并签署原始凭证；&lt;/p&gt;
&lt;p&gt;按设计图纸及有关标准，对承包单位的工艺过程或施工工序进行检查和记录，对加工制作及工序施工质量检查结果进行记录；&lt;/p&gt;
&lt;p&gt;担任旁站工作，发现问题及时指出并向专业监理工程师报告；&lt;/p&gt;
&lt;p&gt;做好监理日记和有关的监理记录。&lt;/p&gt;
&lt;p&gt;检查旁站监督。&lt;/p&gt;
&lt;h1&gt;工程监理的重要部位、工序清单&lt;/h1&gt;
&lt;p&gt;旁站监理是监理人员控制工程质量，保证质量目标实现必不可少的重要手段。在施工阶段中，监理对关键部位、关键工序实施全过程质量监督活动是质量目标实现基本保证。&lt;/p&gt;
&lt;h2&gt;旁站监理工作范围（施工阶段质量监理）&lt;/h2&gt;
&lt;p&gt;⑴ 基础工程重点监控基础大底板砼、后浇带砼浇筑、地下室墙体施工缝接口细部构造处理。&lt;/p&gt;
&lt;p&gt;⑵ 主体工程重点监控墙板、暗柱、加密箍筋、板留洞、墙下阳角附加筋、后浇带、施工缝、试块。&lt;/p&gt;
&lt;h2&gt;旁站监理的工作要求&lt;/h2&gt;
&lt;p&gt;项目监理机构按工程要求给监理组配备各专业监理人员，督促施工单位落实质保体系。监理人员将巡视、平行检验相结合，并记录旁站监理全过程，发现违反强制性条文时及时制止并督促整改。&lt;/p&gt;
&lt;h2&gt;旁站监理的主要职责&lt;/h2&gt;
&lt;p&gt;⑴ 检查施工企业现场管理人员、质检人员到岗，特殊工种人员持证上岗及施工机械建筑材料准备情况；&lt;/p&gt;
&lt;p&gt;⑵ 督促施工方案中关键部位、关键工序执行情况，有无违反强制性条文规定；&lt;/p&gt;
&lt;p&gt;⑶ 核查进场建筑材料、建筑构配件、商品砼质量检验报告等，并在现场监督施工方进行检验或委托具有资格的第三方进行复验；&lt;/p&gt;
&lt;p&gt;⑷ 做好旁站监理记录和监理日记，保存旁站监理原始资料。&lt;/p&gt;
&lt;h2&gt;旁站监理程序&lt;/h2&gt;
&lt;p&gt;⑴ 制定旁站监理方案：监理范围、监理内容、监理程序、监理人员职责。&lt;/p&gt;
&lt;p&gt;⑵ 现场施工时跟班监督检查现场管理人员、质检人员到岗、特种工种持证上岗及施工机械、建筑材料准备情况。&lt;/p&gt;
&lt;p&gt;⑶ 督促施工方对施工方案中关键部位、关键工序执行情况，有无违反强制性条文规定。&lt;/p&gt;
&lt;p&gt;⑷ 检查进场建筑材料、构配件、商品砼质量检验报告、许可证和复试报告。&lt;/p&gt;
&lt;p&gt;⑸ 做好旁站监理记录和监理日记，保存旁站监理原始记录。&lt;/p&gt;
&lt;h2&gt;旁站监理记录内容&lt;/h2&gt;
&lt;p&gt;(1) 记录旁站日期、天气情况、气温。&lt;/p&gt;
&lt;p&gt;(2) 记录旁站起止时间。&lt;/p&gt;
&lt;p&gt;(3) 记录旁站部位、关键部位和关键工序施工方法和工艺，检查发现存在的问题、处理意见和复查结果。&lt;/p&gt;
&lt;p&gt;(4) 原材料、构配件进场规格、数量、生产厂家。&lt;/p&gt;
&lt;h2&gt;旁站监理要求&lt;/h2&gt;
&lt;p&gt;⑴ 旁站监理人员应当认真履行职责，对需要实施旁站监理的关键部位、关键工序在施工现场跟班监督，及时发现和处理旁站监理过程中出现的质量问题，如实准确地做好旁站监理记录，凡旁站监理人员和施工企业现场质检人员未在旁站监理记录上签字的，不得进行下一道工序施工。&lt;/p&gt;
&lt;p&gt;⑵ 旁站监理人员实施旁站监理时，发现施工企业有违反工程建设强制性标准行为的，有权责令施工企业立即整改，发现其施工活动已经或者危及工程质量的，应当及时向监理工程师或总监理工程师报告，由总监理工程师下达局部暂停施工令或者采取其他应急措施。&lt;/p&gt;
&lt;p&gt;⑶ 旁站监理记录是监理工程师或者总监理工程师依法行使有关签字重要依据。对于需要旁站监理的关键部位、关键工序施工，凡没有实施旁站监理或没有旁站监理记录的，监理工程师或者总监理工程师不得在相应文件上签字。&lt;/p&gt;
&lt;p&gt;⑷ 工程竣工验收后，监理单位应当将旁站监理记录存档备查。&lt;/p&gt;
&lt;h2&gt;旁站监理要点&lt;/h2&gt;
&lt;p&gt;(1) 砼浇筑&lt;/p&gt;
&lt;p&gt;a. 基础、主体、后浇带砼浇筑时检查商品砼供应商的资质和商品砼级配单，强度等级必须符合设计要求。&lt;/p&gt;
&lt;p&gt;b. 在砼浇筑现场随机抽取砼做抗压和抗渗试块，取样方法应符合（混凝土结构工程施工质量验收规范）GB50204－2002 7.4 混凝土施工要求，并测定砼坍落度是否符合砼级配单要求。&lt;/p&gt;
&lt;p&gt;(2) 地下室墙板施工缝、后浇带留设位置应符合设计图纸要求，并按施工技术方案施工。地下室墙板施工缝接口，地下室墙板需涂防水材料，防水材料必须复验合格，并审查施工方案和人员资质上岗证，若需要墙外做盛水试验。&lt;/p&gt;
&lt;p&gt;(3) 剪力墙、板、暗柱加密箍隐蔽&lt;/p&gt;
&lt;p&gt;a. 核查钢筋质保书及复试报告，焊件复试报告必须复试合格&lt;/p&gt;
&lt;p&gt;b. 检查受力钢筋的品种、级别、规格和数量必须符合设计图纸要求。&lt;/p&gt;
&lt;p&gt;c. 检查钢筋连接方式、接头位置、接头数量、接头面积、百分率、锚固长度应符合设计图纸和施工规范要求，受力钢筋的弯钩和弯折应符合设计和施工规范要求。&lt;/p&gt;
&lt;p&gt;d. 检查墙、暗柱箍筋加密区、板留洞、墙下阳角附加筋设置，应符合设计和钢筋砼构造要求。&lt;/p&gt;
&lt;p&gt;e. 检查预埋件、预埋孔的规格，数量、位置等，和控制砼保护层厚度。&lt;/p&gt;
&lt;h1&gt;监理工作程序及管理制度&lt;/h1&gt;
&lt;h2&gt;监理工作依据&lt;/h2&gt;
&lt;p&gt;建设工程监理规范（GB50319－2000）以及国家和地方现行有关工程建设及建设监理的法律、法规、政策、规范及标准。&lt;/p&gt;
&lt;p&gt;政府批准的建设计划、规划要点、设计要点及有关文件。&lt;/p&gt;
&lt;p&gt;本工程监理招标文件。&lt;/p&gt;
&lt;p&gt;监理合同及委托人认可的其它监理工作文件。&lt;/p&gt;
&lt;p&gt;正式的设计文件、图纸及说明。&lt;/p&gt;
&lt;p&gt;与本工程有关的合同或协议。&lt;/p&gt;
&lt;p&gt;委托人发出的指令。&lt;/p&gt;
&lt;p&gt;本公司的ISO9002质量体系文件。&lt;/p&gt;
&lt;h2&gt;监理原则&lt;/h2&gt;
&lt;p&gt;遵循&amp;quot;守法、诚信、公正、科学&amp;quot;的执业准则，坚持以&amp;quot;质量第一、服务第一、信誉第一&amp;quot;的宗旨。&lt;/p&gt;
&lt;p&gt;(1) 守法、诚信、公正、科学&lt;/p&gt;
&lt;p&gt;1) 坚持监理程序的规范性，加强监理的针对性，确保监理的深度和力度；&lt;/p&gt;
&lt;p&gt;2) 坚持按设计图纸、技术规范和质量评定标准监督施工；&lt;/p&gt;
&lt;p&gt;3) 坚持对原材料、半成品和成品质量的严格把关，坚持事前控制、过程监控（旁站）和复检验收相结合；&lt;/p&gt;
&lt;p&gt;4) 坚持促使施工单位健全现场质保体系；&lt;/p&gt;
&lt;p&gt;5) 坚持督促施工单位按经审批的《施工组织设计》施工；&lt;/p&gt;
&lt;p&gt;6) 坚持落实安全生产措施；&lt;/p&gt;
&lt;p&gt;7) 坚持施工计划的先进可靠性和执行的严肃性，保证工程进度；&lt;/p&gt;
&lt;p&gt;8) 坚持按合同计量支付，控制好总费用；&lt;/p&gt;
&lt;p&gt;9) 坚持监理的公正性，促进合同的全面履行，并做好信息管理以及处理好业主和各相关的组织协调工作。&lt;/p&gt;
&lt;p&gt;(2) 质量第一、服务第一、信誉第一&lt;/p&gt;
&lt;p&gt;1) 积极听取业主、承包单位意见，热情做好监理工作。&lt;/p&gt;
&lt;p&gt;2) 监理人员坚持巡查与旁站相交替，重点与一般相结合；发现问题，及时指导纠正。&lt;/p&gt;
&lt;p&gt;3) 积极配合施工，注意质量和效率，不拖拉推诿，不马虎含糊。&lt;/p&gt;
&lt;p&gt;4) 及时反映信息和请示，使业主及时掌握工程进展情况，对重大事情及时决策。&lt;/p&gt;
&lt;p&gt;5) 加强学习，不断更新知识，提高监理水平，为工程建设和业主提供更优质的监理服务。&lt;/p&gt;
&lt;h2&gt;项目监理部内部管理制度&lt;/h2&gt;
&lt;p&gt;请示汇报制度。项目监理部应根据公司制定的工作标准，及时将工程中发生的重大技术问题、经济问题、合同中执行的问题向业主和公司领导请示汇报。&lt;/p&gt;
&lt;p&gt;监理月报制度。项目监理部应按公司制定的工作标准的要求，每月编写监理月报，报送业主和公司。&lt;/p&gt;
&lt;p&gt;监理日记制度。项目监理部应指定专人每日写监理日记，记录当日工程的进度，质量和其他重要情况，并定期装订成册。&lt;/p&gt;
&lt;p&gt;对外行文制度。项目监理部对外单位行文，一般应由经办监理工程师起草，交由监理项目负责人审核定稿，重要的文件应向公司领导请示。有条件的工地，均应采用电脑打印。&lt;/p&gt;
&lt;p&gt;监理会议制度。项目监理部应按公司要求，每月召开一次监理会议，传达公司生产会议和安全业务学习有关内容和文件，讨论当前监理工作中存在的问题和解决方法，下月监理工作的计划和重点等。&lt;/p&gt;
&lt;p&gt;实施项目监理人员考评办法。&lt;/p&gt;
&lt;p&gt;考核内容分为：职业道德、工作任务、工作质量、工作纪律、外部评价五部分，共18项。&lt;/p&gt;
&lt;p&gt;考核对象及计分：项目监理部负责人（总监或总监代表）、专业监理工程师、监理员，按分工职责对照&amp;quot;监理人员工作守则&amp;quot;、&amp;quot;项目监理部考评办法&amp;quot;、&amp;quot;工作标准&amp;quot;、&amp;quot;项目监理部工作分工及岗位职责&amp;quot;逐个分项进行对照考核计分。&lt;/p&gt;
&lt;p&gt;考核结果分为&amp;quot;优秀&amp;quot;、&amp;quot;称职&amp;quot;、&amp;quot;基本称职&amp;quot;、&amp;quot;不称职&amp;quot;四个档次，得分＞95分为&amp;quot;优秀&amp;quot;；95分≥得分≥85分为&amp;quot;称职&amp;quot;；85分＞得分≥70分为&amp;quot;基本称职&amp;quot;；得分＜70分为&amp;quot;不称职&amp;quot;。对获优秀者给予奖励；称职者给予通报表扬；对不称职者要对其工作能力、技术水平和工作责任心进行评估，采取岗位留用察看或调离工作岗位。&lt;/p&gt;
&lt;p&gt;考核结果将通知受考核人，并由监理部和办公室记录存档，作为监理人员晋升、提薪和使用的重要依据。&lt;/p&gt;
&lt;h2&gt;监理内部管理方法&lt;/h2&gt;
&lt;p&gt;监理工作实行项目总监理工程师负责制和公司总工室技术巡视监控相结合的监理模式，这一模式责任明确，便于发挥监理人员积极性和主动性，又通过技术巡视监控有利于发挥公司集体技术优势，旨在做好监理工作。&lt;/p&gt;
&lt;p&gt;坚决执行建设监理工作守则，做到：正确执行国家及省、市建设法规、有关规范、标准和要求。守法、公正、诚实、科学维护国家利益。§不与施工单位、设备制造、材料供应单位发生经营隶属关系，不泄露有关的消息，依法公正办事；参加本工程的监理工作人员均为专职从事本单位、本工程的监理业务，不在受监工程的设计、施工单位、设备制造和材料供应单位任职；独立承担监理业务，不转让、不超越从事监理合同规定的权限活动；接受建设主管机关的管理和监督，每月向业主提供监理月报，特大问题或特殊问题专题报告。&lt;/p&gt;
&lt;p&gt;严格遵守监理工程师守则，做到：认真学习执行建设监理的政策法规；坚持原则，秉公办事，抵制不正之风；工作认真、负责，严格按国家规范标准监理；钻研业务，尊重客观、科学的工作态度，接受监理主管部门指导，总结经验，提高监理水平。&lt;/p&gt;
&lt;h2&gt;本工程有关的监理保障措施&lt;/h2&gt;
&lt;p&gt;(5) 由本公司副总亲自抓、在人、财、物方面给予有力保障，全力支持本工程监理工作&lt;/p&gt;
&lt;p&gt;如果我公司能够有幸中标参与本工程的建设，我公司将由公司的国家注册监理工程师------XXX同志亲自挂帅。公司在人、财、物方面给予最有力的保障，全力支持本工程监理工作，开创本公司在东莞市的优质监理品牌。保证全面协助业主实现工程建设各项预定目标，向建设单位交一份满意的答卷。&lt;/p&gt;
&lt;p&gt;(6) 组成盈丰·商住中心工程项目监理部&lt;/p&gt;
&lt;p&gt;如果本公司有幸中标，我公司将派出具有类似工程监理经验的人员组成盈丰·商住中心工程项目监理部。确保其项目监理人员的高素质，全面实现本工程监理工作的预定目标，确保为项目业主提供满意的监理工作服务。&lt;/p&gt;
&lt;p&gt;(7) 在已具监理经验的基础上采取科学的监理工作方法确保监理工作及时到位&lt;/p&gt;
&lt;p&gt;如果我公司有幸中标，我们将充分利用在类似工程监理中所取得的经验全心全意的做好各项监理工作，为业主提供优质的监理服务。&lt;/p&gt;
&lt;p&gt;(8) 以规范的管理制度和优秀的专业监理人才库做保障&lt;/p&gt;
&lt;p&gt;我司已经在工程监理领域走过了十年多的历程，一直注重监理工作的制度比、规范化和科学化管理，并已通过ISO质量体系认证；同时，众多经历过类似工程监理工作的优秀专业监理工程师，可以为本工程建设监理工作提供最有力的人才保障。&lt;/p&gt;
&lt;h2&gt;组织协调的任务&lt;/h2&gt;
&lt;p&gt;组织协调在本工程中是监理工程师十分重要的工作之一，监理工程师主要做好有关现场各方面协调工作，同时处理好各种资源在现场的平衡和协作问题，在可能条件下，协助业主进行外部协调；调整与项目实施的有关的各方的工作关系，统一认识，共同努力实现茖项目的目标任务，具体分析，组织协调的任务有以下几个方面：&lt;/p&gt;
&lt;p&gt;(1) 承包人队伍内部人员的关系&lt;/p&gt;
&lt;p&gt;项目实施的好坏，首先取决于承包人工作。承包人作为一个整体，应当有完善的施工管理和很高的工作效率。一旦承包人内部人员之间发生矛盾，将影响工程施工，尤其是个别人员不称职的情况，对工程影响尤其大。监理应通过业主、承包人等方面，协调好处理好承包人内部的关系，保证项目实施。&lt;/p&gt;
&lt;p&gt;(2) 承包人与业主的关系&lt;/p&gt;
&lt;p&gt;承包人与业主的关系，是既统一又矛盾的，双方一致的方面在于双方都希望工程项目顺利实施。矛盾的方面在于双方的经济利益，如何强调双方一致的方面，克服矛盾的方面，同心协力，做好项目实施，也是十分重要的。&lt;/p&gt;
&lt;p&gt;(3) 设计与施工的关系&lt;/p&gt;
&lt;p&gt;承包人按图施工，是合同条款规定了的，是承包人必须承担的义务。但在施工中因为各方面的原因，变更设计是常有的事情，有的因为原设计考虑不周，尤其施工条件考虑不足；有的是因为现场条件改变，有的是业主或承包人提出要求，监理工程师要正确评价各种设计变更的要求，正确做好设计变更，处理好设计与施工的关系，也是保证施工正常、顺利进行的重要工作。&lt;/p&gt;
&lt;p&gt;所有的组织协调工作，都必须在合同规定的前提下进行。监理工程师的组织协调是监理合同的一部分，必须以合同条款为依据，把各方面的认识统一到合同条款上来，才能保证工作协调有效地进行，达到预想的效果。&lt;/p&gt;
&lt;h2&gt;组织协调的方法&lt;/h2&gt;
&lt;p&gt;为了有效地开展工程各项监理工作，监理工程师将采取以下开展本工程的监理工作。&lt;/p&gt;
&lt;p&gt;(4) 监督参建单位各方认真履行合同条款&lt;/p&gt;
&lt;p&gt;监理工程师在对工程费用控制、进度控制、质量控制协调中，要求各方严格履行合同规定的责任与义务，用合同手段防止参建各方之间发生扯皮现象。&lt;/p&gt;
&lt;p&gt;(5) 努力促使各参建单位相互配合&lt;/p&gt;
&lt;p&gt;监理工程师一定要树立公正的形象，促使参建单位相互信任，互相协调，互相配合，形成一个合作的群体。&lt;/p&gt;
&lt;p&gt;(6) 督促各参建单位内部协调工作正常运转&lt;/p&gt;
&lt;p&gt;监理工程师不要干预参建单位的内部协调工作，但要督促各单位发挥内部组织协调作用，减轻整体协调的工作。&lt;/p&gt;
&lt;p&gt;(7) 发挥工地会议的协调作用&lt;/p&gt;
&lt;p&gt;工地会议是组织协调和重要组织形式，监理工程师通过工地会议，对工作进行协调、检查，并落实下阶段任务。工地会议有第一定工地会议、监理例会、专题会议三种形式，除第一次会议由业主主持外，其余二次会议一般由总监理工程师主持，会后整理成会议纪要，经业主、监理工程师、承包商签字，对各方产生约束力。&lt;/p&gt;
&lt;h2&gt;组织协调措施&lt;/h2&gt;
&lt;p&gt;(1) 监理工作会议制度&lt;/p&gt;
&lt;p&gt;工地会议是监理工程师组织协调的重要形式，工地会议有三种形式：第一次工地会议、工地会议（例会）、专题会议。&lt;/p&gt;
&lt;p&gt;第一次工地会议：&lt;/p&gt;
&lt;p&gt;其准备工作应在施工准备阶段进行，正式开工前召开。&lt;/p&gt;
&lt;p&gt;第一次工地会议由建设单位主持，通知监理工程师、设计单位、承包人及有关方面人员参加。&lt;/p&gt;
&lt;p&gt;会议的主要内容有：&lt;/p&gt;
&lt;p&gt;1) 项目业主、承包商和监理工程师介绍各自驻场组织机构、人员及其分工；&lt;/p&gt;
&lt;p&gt;2) 项目业主介绍工程开工准备情况（主要是场地、三通一平、外部环境、设计图纸到位等）；&lt;/p&gt;
&lt;p&gt;3) 项目业主根据委托监理合同宣布对项目总监理工程师的授权；&lt;/p&gt;
&lt;p&gt;4) 承包商介绍对本工程施工准备情况（人员、机械、材料、临时设施、技术等）；&lt;/p&gt;
&lt;p&gt;5) 项目业主和总监理工程师对施工准备情况提出相关意见和要求；&lt;/p&gt;
&lt;p&gt;6) 总监理工程师介绍监理规划的主要内容并将有关监理程序及监理用表分发给承包商；&lt;/p&gt;
&lt;p&gt;7) 确定今后各方在施工过程中参加工地例会的主要人员，以及工地例会加开的周期、地点、下一次工地例会的时间及主要议题。&lt;/p&gt;
&lt;p&gt;工地会议（例会）：&lt;/p&gt;
&lt;p&gt;根据本工程的实际情况拟由总监理工程师主持每周召开一次，特殊情况另定。&lt;/p&gt;
&lt;p&gt;会议的主要内容：&lt;/p&gt;
&lt;p&gt;1) 检查上一次会议定事项的落实情况，分析未完事项的原因，并批出处理的方法；&lt;/p&gt;
&lt;p&gt;2) 检查项目进度计划的完成情况，提出下一阶段进度的目标及其落实的措施；&lt;/p&gt;
&lt;p&gt;3) 检查分析工程本阶段的质量状况，并针对工程中存在的质量问题提出相应的改进措施；针对工程质量缺陷及控件标准、施工工艺等进行检查，并提出整改意见。&lt;/p&gt;
&lt;p&gt;4) 检查工程计量核定及工程款支付情况，对工程支付中存在的问题提出相应改进方法；&lt;/p&gt;
&lt;p&gt;5) 提出工程实施中所遇到的实际问题并求得解决的方法；&lt;/p&gt;
&lt;p&gt;6) 审查施工安全事项，消除事故隐患；&lt;/p&gt;
&lt;p&gt;7) 工程实施中的其它事项（如工程索赔等）；&lt;/p&gt;
&lt;p&gt;专题会议：&lt;/p&gt;
&lt;p&gt;在本工程中，总监理工程师或专业监理工程师，将根据需要不定期召开现场专题会议，就工作安排、近期施工现场问题等进行研究讨论，以解决工程实施中的有关问题。&lt;/p&gt;
&lt;h2&gt;缺陷责任期的监理任务及措施&lt;/h2&gt;
&lt;p&gt;我司将根据本工程的特点，在监理缺陷责任期内配置足够的监理人员，以确保在缺陷责任期内，圆满的完成相关监理任务，使本工程真正让业主满意、让使用单位放心。&lt;/p&gt;
&lt;p&gt;(1) 缺陷责任期的监理任务&lt;/p&gt;
&lt;p&gt;1) 及时会同项目使用单位，对使用中发现的质量缺陷进行分析与确认。&lt;/p&gt;
&lt;p&gt;2) 对属于因承包施工过失而引起的质量缺陷，及时通知承包商在合同规定的时间内给予无偿修复。&lt;/p&gt;
&lt;p&gt;3) 对不属于原工程承包商施工过失所引起的缺陷，将向项目业主说明情况，并提出有关解决的建议。&lt;/p&gt;
&lt;p&gt;4) 对所需修理的质量缺陷，严格进行现场旁站监督，确保所修理的工程项目质量合格。&lt;/p&gt;
&lt;p&gt;5) 当属于原承包人应承担的责任，而原承包商拒不履行时，监理工程师将建议项目业主，根据原合同文件所约定的处理方法，另请他人进行修理至合格质量标准，其所发生的费用在原承包商的保修款中扣除，因此所发生的费用，监理工程师将作出客观公正的证明。&lt;/p&gt;
&lt;p&gt;6) 当缺陷责任期终止，经检验无工程质量缺陷后，监理工程师将按照有关规定，向承包商颁发&amp;quot;缺陷责任期终止证书&amp;quot;并签署工程最终支付证书，报项目业主批准办理工程最终结算。&lt;/p&gt;
&lt;p&gt;(2) 缺陷责任期的监理措施&lt;/p&gt;
&lt;p&gt;1) 严格按合同文件约定，对照检查承包商留驻现场保修人员及所备特殊材料的数量与质量。&lt;/p&gt;
&lt;p&gt;2) 与本工程项目匠管理、使用单位保持良好的工作沟通，全面了解工程使用情况，及时将有关信息反馈给项目业主及原工程承包商。&lt;/p&gt;
&lt;p&gt;3) 与承包商有关部门保持经常性的工作联络，及时沟通有关保修信息。&lt;/p&gt;
&lt;p&gt;4) 对使用单位所反映的问题进行现场调查，分析质量缺陷发生的原因，认定其相关责任方。严格按合同约定条款，通知责任人及时派员进行质量缺陷的处理，以确保给用户的影响降到最低限度。&lt;/p&gt;
&lt;p&gt;5) 采取合同措施，对违约责任方按合同约定条款进行相应的处罚。&lt;/p&gt;
&lt;p&gt;6) 对违约人，将采取向建筑业有关主管部门备案的方式，以督促其认真男自己的职责。&lt;/p&gt;
&lt;p&gt;7) 认真协助项目业主选定后备修理力量，确保其修理工期令使用方满意、质量符合国家有关标准。&lt;/p&gt;
&lt;p&gt;8) 对项目业主按合同约定另行委请的修理单位，所提供的质量缺陷修理报价进行严格的审查，以确保各方的合法权益不受损害。&lt;/p&gt;
&lt;h2&gt;监理工作制度及廉洁自律措施&lt;/h2&gt;
&lt;h3&gt;监理工作制度&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;监理现场办公室布置和户外宣传的规定&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为使公司各项目监理的现场办公室布置和产外宣传工作规定和统一，特制订本规定。&lt;/p&gt;
&lt;p&gt;(1) 工作标准&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;户外标准&lt;/p&gt;
&lt;p&gt;A. 红底黄字布幅：公司全名称（横或竖）幅，挂于建筑排栅架上的显眼位置。重点工程，大型项目、有代表性的项目，新区项目均张挂。竖幅大小1600×90㎝或2200×220㎝。横幅大小800×100㎝或160×200㎝。此幅也可画在工地围墙上。&lt;/p&gt;
&lt;p&gt;B. 红底横字布幅：公司司标，挂于建筑排栅架上的显眼位置，通常在公司名称幅的头端位置。横幅大小400×150㎝，方幅250×250㎝或120×120㎝。此幅也可画工地围墙上。&lt;/p&gt;
&lt;p&gt;C. 横塑板兰字：监理部名称牌，挂于监理部办公室外门顶部，尺寸为60×40㎝，由公司统一制做。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;监理部现场办公室布置标准&lt;/p&gt;
&lt;p&gt;A. 白塑板：项目监理部目标牌，挂于监理部办公室内墙上显眼处。大小60×40㎝，由公司统一制做。&lt;/p&gt;
&lt;p&gt;B. 白塑板：共七块，在监理部室内墙上集中张挂，大小有80×55㎝和55×35㎝两种，其挂顺序是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; a. 方针、要求、准则

 b. 监理人员工作守则

 c. 本公司监理人员十不准

 d. 总监理工程师职责

 e. 监理工程师职责

 f. 原材料、构配件及设备签认等程序框图

 g. 工程计量工作等程序框图&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自绘室内工作图表与控制图表、投资控制、质量控制、合同及信息管理等图表。&lt;/p&gt;
&lt;p&gt;A. 进度控制图表，[进行计划网络图(横道图)，实际进度与计划进度的对比示意图，框架形象进度图等]。&lt;/p&gt;
&lt;p&gt;B. 质量控制图表，(质量影响因素分析图、质量控制点、控制措施等)。&lt;/p&gt;
&lt;p&gt;C. 投资控制图表(计划与实际投资曲线，主要资金使用情况等)。&lt;/p&gt;
&lt;p&gt;D. 合同及畔管理，(监理组织架构、合同主要条款进程、施工单位人、机、料动态，各配合单位及天气情况)等。&lt;/p&gt;
&lt;p&gt;E. 监理内业及各种归资料；根据《监理资料和文件移交控制程序》和《项目监理部年终考核评表》的内容及时收集、整理、完善与归档。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(2) 工作流程&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;项目监理部负责人在工程项目监理工作开始之时，就应立即创作条件完善监理现场办公室的布置，首先到工程管理部资料室领取，由公司统一制作的九块标牌，拿到监理现场后填上相应内容，在合理显眼的位置上整齐、完整地张挂好。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对产外宣传布幅和公司标幅，应视工程施工进展，在合适的高度和位置上张挂，最好同施工单位及工程名称一同张挂，在工地围墙宣传时，也应与建筑项目和施工单位同时进行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;quot;三控制两管理一协调&amp;quot;的图表和内容，应随工程进及时制作图表，张挂在合适的墙上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;监理的办公室布置应保持整洁、美观、有序、规范、监理内业的各种图表和资料应及时制用完善和收集整理。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(3) 检查与考核&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;工程管理部在项目监理部开展监理工作后三十天内应检查监理现场办公室布置和产外宣传规范化工作情况，检查用表参考《项目监理部年终考评表》。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;检查结果作为项目监理部和监理人员年终考核材料之一。&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;
&lt;p&gt;本公司监理人员岗位职责(详见相关内容的描述)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;履行职务宣誓制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(1) 关于监理人员履行职务实行宣誓的规定&lt;/p&gt;
&lt;p&gt;1) 为了体现监理工作的重要性和严肃性，增强监理人员的职业道德观念，提高工作责任感，公司对项目监理部的监理人员履行职务实行宣誓的制度，并制定本规定。&lt;/p&gt;
&lt;p&gt;2) 监理人员常驻一个项目进行监理时都要宣誓(监理工作的除外)，宣誓一般安排在第一次工地会议开始时进行，也可安排在其他合适的时间，项目监理部第一次宣誓应邀请建设、施工等单位的代表参加，后派驻工地监理人员的宣誓是否邀请建设、施工单位的代表参加，根据实际情况由工程管理部或项目监理部负责人决定。&lt;/p&gt;
&lt;p&gt;3) 参加宣誓的人员应面向监誓人，通常举右手、齐肩所握拳，由项目监理部负责人领读誓词，其他监理人员齐声跟读，最后各宣誓人报自己的姓名，誓词可用大字书写张贴在墙上，或印发给每个宣誓的监理人员。项目监理部的第一次宣誓的监誓人一般由分管经理或公司指派的代表担任，以后派驻工地监理人员的宣誓的监誓人由项目监理部负责人担任。&lt;/p&gt;
&lt;p&gt;4) 宣誓的誓词是：本人受公司的委任，担任XXX工程项目的监理，定当坚决维护国家的荣誉和制度，严格遵守&amp;quot;守法、诚信、公正、科学&amp;quot;的执业准则，以对历史、人民和建设单位高度负责的精神，认真履行监理合同规定的义务和职责，严格监理，勤奋工作，遵纪守法、廉洁奉公，对工程质量终身承担监理的责任。&lt;/p&gt;
&lt;p&gt;宣誓人：XXX&lt;/p&gt;
&lt;p&gt;5) 宣誓完毕后，宣誓人和监誓人应在《监理人员宣誓登记表》上签字。&lt;/p&gt;
&lt;p&gt;6) 本规定适用于本公司施工阶段监理的项目监理部，其他项目监理部和与外单位合作监理的项目监理誓不执行本规定。&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;第一次工地会议制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在工程开工前由总业主组织，设计、承包商、监理、质监站等方人员参加召开第一次工地会议，明确工程管理架构，各单位及人员职责，监理内容、监理制度和程序、监理表格的使用、检查开工准备情况等、会后编写分发会议纪要(详见6、7&amp;quot;组织协调的工作任务与方法&amp;quot;)。&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;工程协调例会及会议纪要签发制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;监理人应每周定期召开协调例会，由项目总监理工程师(或总监代表)组织并主持有业主、施工单位及一工程有关的单位参加(必要进可通知设计、质监站等单位参加)，对工程的质量、进度、资金、单位间相互配合等有关情况和存在问题作协调处理，保证工程顺利进行，并指定专人作出记录，会后编写会议纪要，经与会议各方签认并经总监或总监代表签审后，分发各有关单位贯彻执行。&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;设计交底及图纸会审制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1) 设计交底及图纸会审由项目总监理工程师或各专业监理工程师组织。&lt;/p&gt;
&lt;p&gt;2) 图纸会审前，应先由各施工单位及监理人员熟悉及自审图纸。&lt;/p&gt;
&lt;p&gt;3) 设计交底基本程序是：先由设计单位介绍设计意图、结构特点、施工及工艺要求、技术措施及有关注意事项及关键问题；再由施工单位提出图纸中存在的问题和疑点，以及需要解决的技术难题；然后通过三方研究和商讨，拟定出解决问题的方案，并形成会议纪要可备忘录，经 员签署后作为设计图纸的修改或补充，为施工的依据，当场不能解决的问题，设计人员应在约定的期限内予以书面答复。&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;施工组织设计(施工方案)审核制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1) 工程施工前，监理方组织编制项目总进度计划。&lt;/p&gt;
&lt;p&gt;2) 督促承包单位编制施工组织设计。&lt;/p&gt;
&lt;p&gt;审核承包单位施工组织设计，重点是施工组织设计是否与要求的质量、进度目标相冲突，并尽可能发现其中可能存在的问题；质量保证体系是否健全；设备工现场总体布置是否合理，是否有利于保证施工的正常、顺利地进行，是否有利于保证质量；审查工程地质情况及场区环境状况，以及它们可能在施工中对工程质量与安全带来的不利影响，有无应对方案等，审查施工组织技术措施的针对性和有效性。审查施工单位的进度安排和资金供应计划是否合理，是否符合项目控制目标的要求。&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;工程开工、复工申请制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1) 工程正式开工，施工方应提出《工程开工报告书》，经总监理工程师核签后才能开工，并开始计算工期。&lt;/p&gt;
&lt;p&gt;2) 施工方原因造成的工程停工，业主方不承担相应的责任。&lt;/p&gt;
&lt;p&gt;3) 因业主方原因造成的工程停工，施工方提交有关停工签证，经监理人员核签并报告业主后确认。&lt;/p&gt;
&lt;p&gt;4) 因质量或安全问题被指令停工者，由事故责任方承担相应的责任。停工后复工时，需履行复工申报手续，经监理人员现场检查落实并核签申请报告后始能复工。&lt;/p&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;技术复核制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1) 对于重要工程，重要部位的坐标方向、轴线、标高等，监理人员应在施工前进行复核预检。&lt;/p&gt;
&lt;p&gt;2) 对重要材料、构件的材质证明、试验资料存在疑问的，监理人员应委托有资质的检测部门(机构)进行复检。&lt;/p&gt;
&lt;p&gt;3) 对已完工程结构，必要时采用适当方法对结构强度、密实度进行复核。&lt;/p&gt;
&lt;p&gt;4) 重要的技术复核内容及范围须经总监理工程师审核批准。&lt;/p&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;巡查工地制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;巡查工地制度：&lt;/p&gt;
&lt;p&gt;1) 为及时掌握各监理工地实际情况，从管理和技术方面发现监理服务中凡种种不合格事项，采取纠正和预防措施，使监理服务始终循着国家法规和监理合同要求进行。&lt;/p&gt;
&lt;p&gt;2) 巡查工地是公司各级管理人员经常性必须执行的任务，并应如实记录。&lt;/p&gt;
&lt;p&gt;3) 各级管理人员的巡查重点内容、对象和频率见附表。&lt;/p&gt;
&lt;p&gt;4) 巡查工作必须事先有计划，每月总监会后，根据总监汇报情况，确定工地巡查计划。公司最高领导的巡查计划自主决定，总工程师、副总工程师和主任工程师的巡查计划由总工程师统一研究安排，部门经理根据本部门工作情况自行决定。全部巡查计划必须目标和时间明确，以保证巡查工作有效地及时执行。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;管理人员&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;巡查内容&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;巡查地点&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;巡查频率&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;总经理副总经理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;监理形象、执行国家法律和监理合同、执行公司质量方针、员工守则等情况，征询甲方对监理的意见和评价&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;公司直管重点工程，具有典型意义的大型工程和小型工程&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;每年至少一次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;总工副总工主任工程师&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;监理目标控制和合同信息管理的具体操作情况，特别是影响目标控制的重点和难点的处理情况，在工程技术和监理技术上进行指导。&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;根据各工地进度情况巡查地点针对工程问题的重点，难点出现前及出现中工地选定，或根据工地总监要求进行。&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;在工地必须每半年一次，特殊情况随时安排&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;工程部经理高级成员&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;根据工地进展情况，按国家&amp;quot;监理规范&amp;quot;和公司ISO9002质量体系文件的有关内容，分阶段全面检查&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;大小工地全部检查&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;半年一次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;分管经理&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;根据工地进展情况，按国家&amp;quot;监理规范&amp;quot;和公司ISO9002质量体系文件的有关内容，分阶段全面合格&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;自己分片管理的全部工地&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;每月至少一次&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol start=&quot;11&quot;&gt;
&lt;li&gt;工程材料、半成品质量检验制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1) 凡工程所用材料均应具有质证明或技术合格证，否则不得进场使用。&lt;/p&gt;
&lt;p&gt;2) 用于工程结构的材料，还需抽样复检。&lt;/p&gt;
&lt;p&gt;3) 工程所用半成品，除厂家的生产许可证外，还应具有产品技术合格证或产品说明书。&lt;/p&gt;
&lt;p&gt;4) 使用新材料，应有技术鉴定书。&lt;/p&gt;
&lt;p&gt;5) 对进口材料、器材必须提交海关商检证书。&lt;/p&gt;
&lt;ol start=&quot;12&quot;&gt;
&lt;li&gt;中间交接、隐蔽工程检查验收制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;需作隐蔽验收的分项(部)工程完工后下一工序施工前，施工单位要在自检合格的基础上向监理工程师申请报验。监理工程师对照设计图纸，规程规范确认工程质量符合要求签认后，施工单位才可对工程隐蔽或进行下一工序施工。&lt;/p&gt;
&lt;ol start=&quot;13&quot;&gt;
&lt;li&gt;投资监控制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;监理工程师应严格控制变更设计等，掌握投资变动情况，按期统计分析。对重大变更设计或因采用新技术而增减较大的投资，监理工程师应及时报业主以便控制投资。&lt;/p&gt;
&lt;ol start=&quot;14&quot;&gt;
&lt;li&gt;进度监督制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;监督施工单位严格按照合同规定的计划进度组织实施，监理工程师每月以月报的形式向业主报告各项工程的实际进度及计划的对比和形象进度情况。&lt;/p&gt;
&lt;ol start=&quot;15&quot;&gt;
&lt;li&gt;设计变更处理制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;设计单位设计变更通知要经监理工程师复核签认扣，才可发给施工单位；施工单位和业主若有修改设计变更的意见，要经监理工程师分析提出意见，必须由设计处理的送设计处理。&lt;/p&gt;
&lt;ol start=&quot;16&quot;&gt;
&lt;li&gt;技术经济签证制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;凡是作为竣工验收、工程结算依据的凭证，均需经星人员审核后签证，作为技术性签证的包括：材质证明，材料抽检资料，混凝土配合比及试验资料，中间交接、隐蔽工程检查验收记录，工程质量事故报告及处理意见书，测量记录，质量检验及验收记录，工程变更通知书等。作为经济性签证的包括：工程计量依据，进度款支付申请，停工补偿签证，增加用工签证，工程变更通知书，施工措施费申报书，工程结算书，索赔申请等。&lt;/p&gt;
&lt;p&gt;原始性凭证首先须经现场监理人员签注意见，重要的签证须经项目监理工程师或总监核签。&lt;/p&gt;
&lt;p&gt;终结性凭证除现场相关监理人员签署外，最终应由总监签发才能生效。&lt;/p&gt;
&lt;ol start=&quot;17&quot;&gt;
&lt;li&gt;工程款支付核定制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其工作流程见下图所示：&lt;/p&gt;
&lt;p&gt;[图：工程款支付核定流程]&lt;/p&gt;
&lt;ol start=&quot;18&quot;&gt;
&lt;li&gt;索赔处理制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;施工单位提出的索赔要求，其处理程序见下图所示：&lt;/p&gt;
&lt;p&gt;施工单位提出索赔报告&lt;/p&gt;
&lt;p&gt;总监主持审核&lt;/p&gt;
&lt;p&gt;专业监理工程师配合&lt;/p&gt;
&lt;p&gt;索赔的理由成立？ ——（有理）——→ 接受索赔报告并与对方谈判 ——→ 业主&lt;/p&gt;
&lt;p&gt;↓（无理）                            ↓&lt;/p&gt;
&lt;p&gt;不予受理                         意见一致？&lt;/p&gt;
&lt;p&gt;索赔的依据有效完整？——（有据）——→ 起草索赔意见或协议&lt;/p&gt;
&lt;p&gt;↓（不充分）                      ↓&lt;/p&gt;
&lt;p&gt;要求补充资料                   双方达成一致后签署&lt;/p&gt;
&lt;p&gt;索赔的计算正确？——（有度）——→ 索 赔 生 效&lt;/p&gt;
&lt;p&gt;↓（不正确）                      ↑&lt;/p&gt;
&lt;p&gt;重新计算                      调解 / 仲裁&lt;/p&gt;
&lt;ol start=&quot;19&quot;&gt;
&lt;li&gt;工程质量事故报告及处理制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1) 施工中发生工程质量问题，施工单位必须及时报告现场监理人员，不得自行掩盖和处理。&lt;/p&gt;
&lt;p&gt;2) 施工中发生质量问题，施工单位应提出书面报告，分析事故情况及产生事故原因，提出处理意见，经监理人员现场检查和核签后，才能进行处理。&lt;/p&gt;
&lt;p&gt;3) 对于危及结构安全的严重质量事故，还应约请设计单位、政府质监部门派员现场勘察，审定责任方提出的处理方案。&lt;/p&gt;
&lt;p&gt;4) 重大质量事故经处理后，需进行试验、鉴定。&lt;/p&gt;
&lt;p&gt;5) 施工单位对发生工程质量事故隐蔽不报者，一经查出，除该工程部位不予计量验收外，监理人同还应发出质量整改备忘录，同时抄报业主及政府质监部门，情节严重的，监理人员可下达斩停工指令，对施工单位抽出整改建议。&lt;/p&gt;
&lt;p&gt;6) 施工单位对质量问题有采取有效措施或整改不力，监理人员即应发出质量整改备忘录，或在征得业主的同意下，下达停工指令，并同时抄报业主及政府质监部门。&lt;/p&gt;
&lt;ol start=&quot;20&quot;&gt;
&lt;li&gt;监理报告制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;监理工程师应在规定时间内编写《监理月报》，并在工程竣工后提交《监理工作总结》，报业主。监理月报的内容以具体数字说明施工进度、施工质量、资金使用以及重大安全、质量事故、有价值的经验等。&lt;/p&gt;
&lt;ol start=&quot;21&quot;&gt;
&lt;li&gt;监理日志及监理月报制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1) 现场监理人员需填写监理日志，日志的主要内容包括：自然气候、工程进度、现场各工作面施工状况、参与处理的有关监理事务(当事人提出的问题及我方的答复)、尚待解决的问题、现场发生的重要事项等。&lt;/p&gt;
&lt;p&gt;2) 现场监理组定期(月)向业方提交监理工作通报(同时抄报公司)，内容包括：报告期内监理工作动态、项目建设情况，重大事项的处理及存在的主要问题等。&lt;/p&gt;
&lt;p&gt;3) 监理日志及监理月报由报告人认真、如实填写，并对其真实性、可靠性负责。&lt;/p&gt;
&lt;ol start=&quot;22&quot;&gt;
&lt;li&gt;单项工程验收制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;单项工程的基础、主体、装饰、机电设备等分部工程完工后，施工单位要进行自检，自检合格后报监理工程师进行核验，施工单位将存在问题整改好，经监理工程师签认合格后方可办理分部工程验收核验，单位工程、单项工程完工后施工单位要进行全面自检合格后报监理工程师进行初验，监理工程师初验合格后施工单位方可办理单项工程竣工验收。&lt;/p&gt;
&lt;ol start=&quot;23&quot;&gt;
&lt;li&gt;技术经济资料及档案管理制度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;工程的施工技术资料、监理资料必须指定专人进行收集、整理、审查、归档、移交、存放与查阅。移交借阅要办理签证手续，资料档案要按建设项目文件资料归档范围和保管期限规定要求处理。&lt;/p&gt;
&lt;h3&gt;廉洁自律措施&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;本公司职业准则&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;公司自1997年3月31日贯彻执行建设部《工程建设监理人员工作守则》和公司《监理人员十不准》以来，有力地促进发公司的廉政建设和职业道德建设。经公司总经理办公会议研究，决定把建设部《工程建设监理人员工作守则》和公司《监理人员十不准》作为公司的职业准则，望全体员工自觉遵守，树立监理的良好形象。&lt;/p&gt;
&lt;p&gt;工程建设监理人员工作守则&lt;/p&gt;
&lt;p&gt;(1) 维护国家的荣誉和利益，按照&amp;quot;守法、诚信、公正、科学&amp;quot;的准则执业。&lt;/p&gt;
&lt;p&gt;(2) 执行有关工程建设的法律、法规、规范、标准和制度，履行监理合同规定和义务和职责。&lt;/p&gt;
&lt;p&gt;(3) 努力学习专业技术和建设监理知识，不断提高业务能力和监理水平。&lt;/p&gt;
&lt;p&gt;(4) 不以个人名义承揽监理业务。&lt;/p&gt;
&lt;p&gt;(5) 不同时在两个或两个以上监理单位注册和从事监理活动，不在政府部门和施工、材料设备的生产供应等单位兼职。&lt;/p&gt;
&lt;p&gt;(6) 不为所监理项目指定承建商、建筑构配件、设备、材料和施工方法。&lt;/p&gt;
&lt;p&gt;(7) 不收受被监理单位的任何礼金。&lt;/p&gt;
&lt;p&gt;(8) 不泄露所监理工程各方认为需要保密的事项。&lt;/p&gt;
&lt;p&gt;(9) 坚持独立自主地开展工作。&lt;/p&gt;
&lt;p&gt;本公司监理人员十不准(见&amp;quot;3&amp;quot;)。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;本公司员工行为规范&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;公司遵循待业&amp;quot;守法、诚信、公开、科学&amp;quot;的执业准则和&amp;quot;质量第一、服务第一、信誉第一&amp;quot;的宗旨，大力提倡优质服务，刻苦钻研，树立良好的行为规范不但能提高员工的服务水平和质量，提高工作效益，而且能培养员工良好的职业道德风范。因此，要求每位员工认真按照行为规范的要求，做好本职工作。&lt;/p&gt;
&lt;p&gt;(1) 工作态度&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;开拓进度勤于思考&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;员工在工作中应保持良好的精神面貌和进取精神。公司提倡员工在岗位上勤于思考，积极提出合理化建议，树立创新意识。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;服从管理严于职守&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;各级员工应切实服从上级的工作安排与调配，严守岗位职责，依时完成任务，不无故拒绝或中止工作，不得迟到、早退或旷工。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;钻研业务提高效率&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;员工应热爱本职工作，刻苦钻研，提高业务水平。在保证工作质量的前提下讲求服务高效率，做到办事为推诿、不拖延。&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;正直诚实勤勉负责&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;员工必须遵守业道德和公司的&amp;quot;监理人员十不准&amp;quot;，养成忠于职守，诚恳待人的品格，坚决杜绝以权谋私，以职谋私，有损监理形象和公司形象的行为，监理工作中做到&amp;quot;优质服务&amp;quot;、&amp;quot;全天候监理&amp;quot;、&amp;quot;廉洁自律&amp;quot;。&lt;/p&gt;
&lt;p&gt;(2) 良好服务的基本要求&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;形象：仪容端庄，服装整洁，应对得体，体现服务的诚意。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;礼貌：待人以诚，诚心诚意为建设单位服务。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自重：工作投入，廉洁自律，诚恳积极，尊重各方，给人留下良好印象。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;知识：熟悉在职之专业知识，熟悉工作的特性关快捷有效地处理各项技术问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;能力：全面认识自己的工作，熟悉工作的特性并快捷有效地处理各项技术问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;尽责：设身处地为建设系统多出一点力，同时帮助施工单位提高管理水平，把工作做得更好。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(3) 仪容仪表基本要求&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;员工下岗时必须戴胸卡，员工工卡必须佩戴在左胸襟上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;男员工不能留长发，发脚长度以保持不盖耳部和不触衣领为度，要经常修脸，不得留长胡须。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;男员工不得化妆(演出有要求除外)；女员工可化妆并保持清新，有良好的精神面貌：男女员工上班时不得佩戴非工作需要的个人装饰品(可以佩戴结婚戒指、项链)。不得留长指甲，女员工不得涂有色指甲油。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;员工上岗前忌吃异味食品，提倡饭后濑口。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;在工作时，应当保持微笑，友好的表情，不得流露厌烦、冷淡。愤怒、紧张和恐惧的表情。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(4) 行为举止&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;谈吐：温文有礼，措辞恰当，清晰明快；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目光：顾盼得宜，目光传神，精神奕奕；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;举止：举手投足，稳重端庄，自然得体。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(5) 礼貌用语&lt;/p&gt;
&lt;p&gt;服务禁语&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;有伤自尊心的话不讲&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有损公司形象的话不讲。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有损人格的话不讲&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;埋怨、责怪、讽刺、挖苦、粗话、脏话、无理的话不讲。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不负责任的话不讲&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;本公司廉洁自律措施&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本公司监理人员十不准&lt;/p&gt;
&lt;p&gt;(1) 不准收受施工单位的任何馈赠或向施工单位索要经济赞助；&lt;/p&gt;
&lt;p&gt;(2) 不准接受施工单位的吃饭或娱乐性招待，工程全部或部分分工时有业主参加的活动除外；&lt;/p&gt;
&lt;p&gt;(3) 不准到施工单位报销发票、收据；&lt;/p&gt;
&lt;p&gt;(4) 不准介绍施工队伍到所监理的工地施工；&lt;/p&gt;
&lt;p&gt;(5) 不准在施工单位兼职或领取任何报酬；&lt;/p&gt;
&lt;p&gt;(6) 不准介绍人员到所监理的施工单位工作；&lt;/p&gt;
&lt;p&gt;(7) 不准介绍、推荐任何建筑材料、设备给监理的施工单位；&lt;/p&gt;
&lt;p&gt;(8) 不准做任何有损害业主利益和声誉的事情；&lt;/p&gt;
&lt;p&gt;(9) 不准玩忽职守或借故拖延，推诿属于职权范围的工作事项；&lt;/p&gt;
&lt;p&gt;(10) 不准参加&amp;quot;黄、赌、毒&amp;quot;活动。&lt;/p&gt;
&lt;h2&gt;向业主提供的监理报告一览表&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;监理工程师进场准备情况报告&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;《工程监理规划》&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;项目承包商进场作业准备情况报告&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工地第一次监理工程师例会纪要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设计交底与图纸会审会议纪要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;总施工组织设计审批表&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程总进度计划及阶段进度计划审批表&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程开工/复工报告审表及工程暂停令&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程总体测量控制审批表&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;监理工程师周例会纪要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程分包单位资格报审表&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;月生产协调会会议纪要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;《监理月报》&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;周工程进度动态分析报告&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程投资完成情况动态与预测分析报告&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;周工程质量动态分析报告&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;监理工程师工作联络单(承包商或业主及有关部门发生工作联系时)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程变更审查表&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;月工程计量单和工程款支付证书&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;月投资实施情况分析报告(含可能存在对项目业主不利的潜在索赔因素分析)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;月建筑材料及设备进场检验情况报告&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;施工难点专项技术研讨会会议纪要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;质量缺陷与事故调查、处理报告(如果有)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;月安全、文明施工阶段检查情况及分析报告&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;单位工程竣工验收质量评估报告&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程实施中的有关建议(含材料、设备价格走势预测：工程部署的调整；材料的更换使用；分包队伍的选择分析；市场设备动态等)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;竣工结算审核意见书&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工程项目施工阶段质量评估专项报告&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;监理工作总结&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;附件一：现场监理工作流程图&lt;/p&gt;
&lt;p&gt;工程建设竣工验收及备案程序和操作流程&lt;/p&gt;
&lt;p&gt;[图：流程图]&lt;/p&gt;
&lt;p&gt;索赔处理程序&lt;/p&gt;
&lt;p&gt;[图：索赔处理程序流程图]&lt;/p&gt;
&lt;p&gt;工程竣工验收程序框图&lt;/p&gt;
&lt;p&gt;[图：工程竣工验收程序框图]&lt;/p&gt;
&lt;p&gt;原材料、构配件及设备签认程序&lt;/p&gt;
&lt;p&gt;[图：原材料、构配件及设备签认程序流程图]&lt;/p&gt;
&lt;p&gt;工程变更处理程序&lt;/p&gt;
&lt;p&gt;[图：工程变更处理程序流程图]&lt;/p&gt;
&lt;p&gt;工序交工验收(中间验收、隐蔽验收)程序&lt;/p&gt;
&lt;p&gt;[图：工序交工验收程序流程图]&lt;/p&gt;
&lt;p&gt;工程计量、进度款支付程序&lt;/p&gt;
&lt;p&gt;[图：工程计量、进度款支付程序流程图]&lt;/p&gt;
&lt;p&gt;分项(分部)工程质量验评程序&lt;/p&gt;
&lt;p&gt;[图：分项(分部)工程质量验评程序流程图]&lt;/p&gt;
&lt;p&gt;工程质量缺陷、重大质量隐患处理程序&lt;/p&gt;
&lt;p&gt;[图：工程质量缺陷、重大质量隐患处理程序流程图]&lt;/p&gt;
&lt;p&gt;工程质量保修期的监理工作程序&lt;/p&gt;
&lt;p&gt;[图：工程质量保修期的监理工作程序流程图]&lt;/p&gt;
&lt;p&gt;合同争议处理程序&lt;/p&gt;
&lt;p&gt;[图：合同争议处理程序流程图]&lt;/p&gt;
&lt;p&gt;工程延期及工程延误处理程序&lt;/p&gt;
&lt;p&gt;[图：工程延期及工程延误处理程序流程图]&lt;/p&gt;
&lt;p&gt;施工监理前期工作程序&lt;/p&gt;
&lt;p&gt;[图：施工监理前期工作程序流程图]&lt;/p&gt;
&lt;p&gt;施工准备阶段监理工作程序&lt;/p&gt;
&lt;p&gt;[图：施工准备阶段监理工作程序流程图]&lt;/p&gt;
&lt;p&gt;工程质量控制工作程序&lt;/p&gt;
&lt;p&gt;[图：工程质量控制工作程序流程图]&lt;/p&gt;
&lt;p&gt;工程造价控制工作程序&lt;/p&gt;
&lt;p&gt;[图：工程造价控制工作程序流程图]&lt;/p&gt;
&lt;p&gt;工程进度控制工作程序&lt;/p&gt;
&lt;p&gt;[图：工程进度控制工作程序流程图]&lt;/p&gt;
&lt;p&gt;合同管理的工作程序&lt;/p&gt;
&lt;p&gt;[图：合同管理的工作程序流程图]&lt;/p&gt;
&lt;h1&gt;合理化建议&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;选择一个好的承包商，是工程能否圆满完成预定建设目标的关键所在。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由于本工程建设标准高，项目业主对本工程的建设特别重视，因此，在本工程建设过程中，除了要有一个具有丰富的类似工程建设经验的监理单位外，一个曾经承担过类似工程施工、具有丰富的类似工程经验的承包商，同样是本工程圆满完成预定目标的可靠保障。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;尽早解决好工程内用电供应，将有利用提高室内装饰工程及设备安装工程施工质量与施工速度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在工程建设中，有关方面往往只限于及时解决好施工用临水、临电问题，而对工程投入使用时所需的用电申请，未能引起足够的重视。由于施工中调试设备所用电负荷比施工临时用电容量大得多，如施工临电无法满足调试要求，将造成设备调试无法按期正常进行，继而影响装修工作，收尾工作的进行，导致工程总体进度拖后。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;尽可能选用档次较高的天然石材，并应具有一定的导向性&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;根据我司类似工程的监理经验，凡取得了较好效果的重要建筑物，均在建筑地面材料选择上花费了较大精力和较多的资金投入。而目前在铺贴用石材材质的品质方面，国产石材与进口石材相比较，不得不承认尚有不小的差距，无论从耐入性还是从材质的均匀度上都存在一定的距离。而高档次石材铺就的地面导向带，更能给市民带来极大的便利，并充分的享受、体会其休闲的乐趣。&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;建议装修工程设计单位选择与装饰施工单位选择相分离，以利于装饰工程的投资控制&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;根据我司的经验，如果在装饰工程实施中，设计与施工均为同一承包单位的话，虽然表面上可以减少一些配合上的矛盾，但却会给工程投资控制带来极大的困难。因为，装饰工程材料的价格变化较大，工艺差异亦十分敏感，设计与施工如同属一家，极易被承包商钻空子，将给业主带来不必要的投资损失，同时也会因价料价格确认所导致大量的扯皮现象，对工期构成影响。&lt;/p&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;h2&gt;保证安全施工的监理控制措施&lt;/h2&gt;
&lt;p&gt;根据我司在湛江地区监理工作的经验探索，结合多个被广东省评为安全、文明施工样板工地的成功经验，将在安全、文明施工监理工作中从以下方面着手进行控制。&lt;/p&gt;
&lt;p&gt;根据本工程的特点，结合我们以往对类似工程的监理经验，我们认为必须从以下几个重点方面，开展工程安全施工的管理工作：&lt;/p&gt;
&lt;p&gt;(1) 督促工程施工总承包商自身及指导各分包商建立体系完整的安全责任制，并应结合经济承包合同对安全生产指标有量化奖惩措施。本工程应充分根据各阶段的特点配备足够的专职安全员，同时明确项目经理为安全生产第一责任人，项目副经理为安全生产直接负责人&lt;/p&gt;
&lt;p&gt;(2) 慎重审查施工组织设计的安全措施。由于施工组织设计的重点是工艺施工、质量控制，措施往往针对性不强，多是泛泛而谈。因此，监理工程师的工作应根据施工项目的特点，要求施工队有针对性的重新编制出专项安全施工组织设计及各相应工种的安全技术操作规程。随着工程的不断深入及时更新，监理工程师要做好跟踪督促工作。&lt;/p&gt;
&lt;p&gt;(3) 抓好安全技术交底工作，根据各工序的施工特点，技术人员应编制详尽的书面安全交底材料，在工序施工前专门召开所属人工大会，进行交底，所有接受人应履行签字手续，现场应有监理人员监督。特殊工种的交底内容还可以对工人进行考试。&lt;/p&gt;
&lt;p&gt;(4) 认真组织好每周、每月的安全大检查，促进安全施工的规范化管理。每周由监理工程师专职员及总包、分包专职安全员组成检查小组，对工程的安全状况进行巡视检查，发现问题及时发出整改通知，限期通知，限期整改。整改完后应立即申请复验。检查后应集体开会总结当前的施工安全状况并做会议记录。每月的安全大检查可以邀请新会市建设局、质检站、劳动局、业主有关人员参加，增强其影响力。&lt;/p&gt;
&lt;p&gt;(5) 必须对进入现场的所有新老员工进行安全培训教育。具体的安全教育内容由技术人员统一编写、统一集中授课、统一考试，合格后才准予上岗。特种作业人员的安全教育应由上级主管部门进行培训，在本工地持证上岗。工作前严禁饮酒，现场不准嬉笑打闹、不准穿拖鞋、硬底鞋进入工地。&lt;/p&gt;
&lt;p&gt;(6) 抓好&amp;quot;三宝四口&amp;quot;的管理工作。要求工人上班过程中应按规定戴好安全帽，发现那怕是一个一不戴安全帽，也应进行整顿，通报批评；脚手架外围采用密目安全网封闭，该安全网应取得当地建筑安全监督管理部门的准用证。高空作业（搭架）时应系安全带。高空作业时应有安全员在现场值班。个别地方应用木板或安全网进行封闭。人员及材料出入口通道应搭设防护棚，上部用模板和安全网双重掩盖，四周临边的防护应结合调试与脚手架联锁，如与脚手架相距较远，则要预留钢筋立柱焊接成临时栏杆作为围护结构。&lt;/p&gt;
&lt;p&gt;(7) 本工程中，脚手架与主体结构应拉结可靠，剪力撑应由底到顶完整设置。外侧应用密目式安全网封闭，应搭设专门的人行通道及上人椄。砌筑施工中要防止架上码砖太多，应按最多300kg/m²控制。&lt;/p&gt;
&lt;p&gt;(8) 本工程现浇砼量较大，因此模板及支架的安全也很重要，建议模板选18厚夹板，支架用钢管或门式支架，此外，在砼强度未达到设计要求前（以试件强度检测报告为准）不能拆模。&lt;/p&gt;
&lt;p&gt;(9) 在本工程中要求承包商单独编制临时用电安全施工组织设计，以规范现场用电的一系列操作制度。首先应结合工种的临电布置合理安排接地、接零点，并应进行地板阻值探测，使之满足安全要求。其实，现场应安排电工巡视维修各用电终端。要求配电箱应按&amp;quot;一机一闸一箱&amp;quot;相等标准设置，开关箱内的漏电开关不得失灵或采用伪劣产品，电箱应设锁，由专业电工负责接线，普通工人不得直接开箱接线。严禁使用金属比代替保险丝，现场用电宜用五芯电缆由配电房拉至各楼层配电箱。由于过载较多，宜架空敷设以利散热。现场脚手架、提升架、塔吊均要安装避雷针，入地电阻要小于10Ω。&lt;/p&gt;
&lt;p&gt;(10) 各种小型机具的安全使用，如平刨、电锯、切割机、电钻、钢筋切割机、弯筋机、搅拌机、氧割、水泵等。由于它们数量多，使用广泛，设备因自身缺少保护装置，所以经常引发工伤事故，因此在管理上应予以高度重视。上述设备负责线的首端处一定要设置漏电保护装置，无人操作时均应切断电源，传动部位应有防护措施，要专人操作，定机定人维修保养。气瓶要有防震圈和防护帽，相隔应满足安全距离及远离明火，乙炔瓶要立放。施工现场各种机械要挂安全技术操作规程牌。&lt;/p&gt;
&lt;h2&gt;保证文明施工的监理控制措施&lt;/h2&gt;
&lt;p&gt;(1) 工地四周设围墙封闭管理，由于本工程工期长达半年，围墙以砖砌为宜，且应刷宣传标语，四周作适当绿化。&lt;/p&gt;
&lt;p&gt;(2) 合理布置出入大门，门头应设置总包的企业标志，大门口设门卫值班室，现场佩戴工卡出入。&lt;/p&gt;
&lt;p&gt;(3) 大门外应挂施工标牌，大门内附近应建立宣传栏，黑板报、安全标语、施工现场平面图。&lt;/p&gt;
&lt;p&gt;(4) 在现场出入口设洗车槽，对进出车辆进行冲洗。&lt;/p&gt;
&lt;p&gt;(5) 现场临时道路应进行硬化处理。&lt;/p&gt;
&lt;p&gt;(6) 四周修筑排水明沟、且对施工污水有处理措施。使基本无积水、楼梯间、楼层开口处有挡水措施。&lt;/p&gt;
&lt;p&gt;(7) 原材料、半成品、构件、机械应按施工总平面图的规划布置，材料分类堆放整齐，且挂注明名称、品种、规格、监理工程师检验与否的标牌。&lt;/p&gt;
&lt;p&gt;(8) 工完场清，合理地回收和使用建筑垃圾，如落地灰用于砂浆、碎砖用于回填、木屑用物食堂生火。&lt;/p&gt;
&lt;p&gt;(9) 施工场地与办公、生活区相对独立，工人不在本新建工程内住宿。&lt;/p&gt;
&lt;p&gt;(10) 现场按规定布置灭火器、消火栓，严禁在施工现场吸烟。&lt;/p&gt;
&lt;p&gt;(11) 电地、氧割时要注意火星洒落，现场锯末、刨花要洒水湿润和及时清理出现场。动火要有监护。&lt;/p&gt;
&lt;p&gt;(12) 现场场生活区要设立广播和电视及其他娱乐设施供工人们娱乐、收听、学习。&lt;/p&gt;
&lt;p&gt;(13) 澡堂、饭堂、厕所应按当地城管办的要求设置，提供开水供工人饮用。炊事员持健康证上岗，夏季施工应有防暑降温措施。&lt;/p&gt;
&lt;p&gt;(14) 生活垃圾应有专人及时清理，外运，并有专用容器供投放、除蚊、来鼠按当地有关规定办理。&lt;/p&gt;
&lt;p&gt;(15) 宜在现场设一个医疗点，以防万一。&lt;/p&gt;
&lt;p&gt;(16) 夜间施工必须有当地政府批准书，且应有降噪措施，防止当地居民投诉。&lt;/p&gt;
&lt;p&gt;(17) 应及时进行洒水降尘，清扫周围道路，做到只施工，不扰民。&lt;/p&gt;            </description>
            <pubDate>2026-05-14 05:08:57</pubDate>
            <link>https://www.syuez.com/blog/%E5%B7%A5%E7%A8%8B%E7%9B%91%E7%90%86%E6%8A%95%E6%A0%87%E4%B9%A6.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%B7%A5%E7%A8%8B%E7%9B%91%E7%90%86%E6%8A%95%E6%A0%87%E4%B9%A6.html</guid>
                                               <category>招投标</category>
                                    </item>
                <item>
            <title>工程投标书范本</title>
            <description>
            &lt;!--
author: admin
date: 2023-04-01
title: 工程投标书范本
tags: 工程
category: 招投标
status: publish
summary: 招投标~
--&gt;
&lt;h1&gt;第1章 编制依据及说明&lt;/h1&gt;
&lt;h2&gt;第1节 编制说明&lt;/h2&gt;
&lt;p&gt;1.1.1根据本工程的设计特点、功能要求,并对工程资金的合理利用、工程质量负责,以&amp;quot;科学、经济、优质、高效&amp;quot;为编制原则。&lt;/p&gt;
&lt;p&gt;1.1.2我公司对本施工组织设计的编制高度重视，召集了参加过类似工程施工、有丰富管理及施工经验的人员，在仔细研究图纸，明确工程特点、充分了解施工环境、准确把握建设方要求的前提下，成立编制专题小组，集思广益、博采众长，力求本方案切合施工实际，可操作性强。&lt;/p&gt;
&lt;p&gt;本工程施工组织设计，主要依据目前国家对建设工程质量、工期、安全生产、文明施工、降低噪声、保护环境等一系列的具体化要求，依照建筑法规、条例、标准及有关配套文件和我公司的企业标准等，结合本工程实际，进行了全面而细致的编制。&lt;/p&gt;
&lt;h2&gt;第2节 编制依据&lt;/h2&gt;
&lt;p&gt;主要有如下：&lt;/p&gt;
&lt;p&gt;《中华人民共和国建筑法》&lt;/p&gt;
&lt;p&gt;《建设工程质量管理条例》&lt;/p&gt;
&lt;p&gt;《混凝土强度检验评定标准》 GBJ107-02&lt;/p&gt;
&lt;p&gt;《建筑地基基础工程施工质量验收规范》 GB50202-02&lt;/p&gt;
&lt;p&gt;《建筑桩基基础技术规范》 JGJ94-2008&lt;/p&gt;
&lt;p&gt;《砌体工程施工质量验收规范》 GB50203-02&lt;/p&gt;
&lt;p&gt;《混凝土结构施工工程质量验收规范》 GB50204-02&lt;/p&gt;
&lt;p&gt;《钢筋机械连接通用技术规程》 JGJ107-02&lt;/p&gt;
&lt;p&gt;《镦粗直螺纹钢筋接头》 JG/T3057-1999&lt;/p&gt;
&lt;p&gt;《钢筋焊接及验收规程》 JGJ18-02&lt;/p&gt;
&lt;p&gt;《屋面工程质量验收规范》 GB50207-02&lt;/p&gt;
&lt;p&gt;《建筑地面工程施工质量验收规范》 GB50209-02&lt;/p&gt;
&lt;p&gt;《建筑装饰装修工程质量验收规范》 GB50210-01&lt;/p&gt;
&lt;p&gt;《建筑给水排水及采暖工程施工质量验收规范》 GB50242-2002&lt;/p&gt;
&lt;p&gt;《建筑电气工程施工质量验收规范》 GB50303-02&lt;/p&gt;
&lt;p&gt;《建筑工程施工质量验收统一标准》 GB50300-2001&lt;/p&gt;
&lt;p&gt;《建筑变形测量规程》 JG/T88-97&lt;/p&gt;
&lt;p&gt;《建设工程项目管理规范》 GB/T50236-2001&lt;/p&gt;
&lt;p&gt;《工程网络计划技术规程》 JGJ/T1001-06&lt;/p&gt;
&lt;p&gt;《建筑工程冬季施工措施》 JGJ104-02&lt;/p&gt;
&lt;p&gt;《建设工程文件归档整理规范》 GB50328-01&lt;/p&gt;
&lt;p&gt;《工程建设标准强制条文》（房屋建筑部分） 2002版&lt;/p&gt;
&lt;p&gt;《房屋建筑工程质量保修办法》&lt;/p&gt;
&lt;p&gt;《中华人民共和国安全生产法》&lt;/p&gt;
&lt;p&gt;《建筑工程施工现场管理规定》&lt;/p&gt;
&lt;p&gt;《建筑安装工程安全技术规程》&lt;/p&gt;
&lt;p&gt;《建筑施工安全检查标准》 JGJ59-06&lt;/p&gt;
&lt;p&gt;《施工现场临时用电安全技术规范》 JGJ46-08&lt;/p&gt;
&lt;p&gt;《建筑施工安全用电》&lt;/p&gt;
&lt;p&gt;《漏电保护器及漏电保护技术》&lt;/p&gt;
&lt;p&gt;《建筑施工高处作业安全技术规范》 JGJ80-02&lt;/p&gt;
&lt;p&gt;《建筑机械使用安全技术规程》 JGJ33-02&lt;/p&gt;
&lt;p&gt;《给排水管道工程施工及验收规范》 GB50268-2008&lt;/p&gt;
&lt;p&gt;《低压配电系统设计规范》 GB50054-95&lt;/p&gt;
&lt;p&gt;《民用建筑工地电气设计规范》 JGJ16-2008&lt;/p&gt;
&lt;p&gt;《工业建筑防腐蚀设计规范》 GB50046-2008&lt;/p&gt;
&lt;p&gt;《招标文件》及其他相关文件,工程施工图纸、图纸答疑.&lt;/p&gt;
&lt;p&gt;公司质量体系文件、技术标准、工法等有关建筑工程各项规章制度.&lt;/p&gt;
&lt;p&gt;本工程施工组织设计的编制是按照建设单位招标及答疑文件等的要求和现场周边环境进行了认真而详细的编制，未提之处均按照施工图纸设计、国家现行技术规范、规程、质量评定标准以及有关文件等要求的具体规定进行施工。&lt;/p&gt;
&lt;h2&gt;第3节 本次施工组织设计主要内容&lt;/h2&gt;
&lt;p&gt;根据本建设项目工程的地理位置、工程特点、结构形式、工艺要求、使用功能、装饰标准和招标文件等的要求，本施工组织设计编制的主要内容有：&lt;/p&gt;
&lt;p&gt;工程概况、现场布置、施工总体部署、施工进度计划、施工准备、项目施工组织机构的设置、分部分项工程的主要施工方法、施工技术组织措施、保证质量的技术组织措施、保证工期的技术组织措施、安全施工技术组织措施、减少扰民及环境保护与文明施工技术组织措施、季节性施工措施、主要工种劳动力、主要施工机械设备和施工机械、主要周转材料、主要材料投入计划，施工现场平面布置和施工进度计划网络图等。&lt;/p&gt;
&lt;h1&gt;第2章 工程概况&lt;/h1&gt;
&lt;h2&gt;第1节 工程概况&lt;/h2&gt;
&lt;p&gt;本施工组织设计对风光苑8号住宅楼工程进行统一施工策划。工程南面临街，北靠1、2号楼，东临6、7＃住宅，西边与省纪检委紧临。此住宅楼为十二层高层建筑，建筑高度40.400m。住宅采用一梯二户单元布置，每单元设置一部电梯和一个楼梯，底层用作社区用房、活动中心、管理用房等。&lt;/p&gt;
&lt;p&gt;本工程设防烈度为六度，属二类建筑；建筑结构的安全等级为二级；地基基础设计等级为乙级；建筑桩基的安全等级为二级；建筑抗震设防为丙类；剪力墙抗震等级为三级；结构构件的耐火等级为二级。&lt;/p&gt;
&lt;h2&gt;第2节 建筑设计概况&lt;/h2&gt;
&lt;p&gt;门窗工程：其中门有镶板门、塑钢推拉门、甲乙级防火门，窗为塑钢窗（大部分窗带纱），一层设有铝合金门连窗。&lt;/p&gt;
&lt;p&gt;油漆：木门及木制构件刷黄色调和漆一底二度；室内外露明金属构件做防锈漆一道，银粉漆二道，木质构件与墙体接触处满涂防腐油一道。&lt;/p&gt;
&lt;p&gt;建筑防水：墙体防潮层设在室内一层的墙体标高-0.060m处，用20厚1：2水泥砂浆掺5％防水剂。屋面的上人屋面为刚性防水和高聚物改性沥青卷材防水屋面；不上人屋面为高聚物改性沥青卷材防水屋面。&lt;/p&gt;
&lt;p&gt;建筑装修：&lt;/p&gt;
&lt;p&gt;内墙：白色乳胶漆、混合砂浆。&lt;/p&gt;
&lt;p&gt;外墙：白色彩砂涂料和水刷石。&lt;/p&gt;
&lt;p&gt;楼地面：水泥砂浆和陶瓷地砖。&lt;/p&gt;
&lt;p&gt;顶棚：混合砂浆顶棚。&lt;/p&gt;
&lt;h2&gt;第3节 结构设计概况&lt;/h2&gt;
&lt;p&gt;本工程为钢筋混凝土框架-剪力墙结构，本工程场地土类型为Ⅱ类中软场地土。本工程基础为桩上承台－地梁基础。&lt;/p&gt;
&lt;p&gt;2.3.1混凝土：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;桩身及护壁的混凝土强度等级为C25，承台、基础梁混凝土强度等级为C30。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;2.其它部位的混凝土强度等级如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;起止高度&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;剪力墙&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;梁、板等&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;-1.500---15.470&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;C35&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;C30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;15.470---27.470&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;C30&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;C25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;27.470以上&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;C25&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;C25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;2.3.2钢筋：HPB 235级钢、HRB335级钢。&lt;/p&gt;
&lt;p&gt;钢筋连接：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;钢筋直径d≥18者采用A级直螺纹套筒接头。&lt;/li&gt;
&lt;li&gt;钢筋直径在14---18之间者采用闪光对焊，现场接头可采用双面搭接焊5d。&lt;/li&gt;
&lt;li&gt;钢筋直径在12以下者可搭接接长。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;2.3.3钢筋保护层厚度：&lt;/p&gt;
&lt;p&gt;承台、基础梁：40mm。&lt;/p&gt;
&lt;p&gt;柱：30mm且不小于d。&lt;/p&gt;
&lt;p&gt;梁：25mm且不小于d。&lt;/p&gt;
&lt;p&gt;楼（屋）面板、剪力墙：15mm且不小于d。&lt;/p&gt;
&lt;p&gt;2.3.4填充墙墙体材料：&lt;/p&gt;
&lt;p&gt;加气混凝土砌块外墙厚度250mm、分户墙楼（电）梯间墙为200mm、其余内墙为150mm，干容重不大于5.0KN/m^3^,M5混合专用砂浆砌筑。&lt;/p&gt;
&lt;p&gt;±0.000m以下墙体采用蒸压粉煤灰砖，外墙厚250，内墙为200，用水泥砂浆砌筑。&lt;/p&gt;
&lt;h2&gt;第4节 水、电工程设计概况&lt;/h2&gt;
&lt;p&gt;本工程安装部分内容包括给排水系统、电气照明系统、消防灭火系统、屋面雨水排水系统、防雷及接地系统等。防雷及接地系统：屋顶沿女儿墙设避雷网，所有金属管、用电设备外壳均与避雷带作可靠连接。避雷网采用园钢沿女儿墙敷设，并经框架剪力墙内焊接钢筋，接入基础并与基础内主筋贯通。&lt;/p&gt;
&lt;h2&gt;第5节 施工重点和难点&lt;/h2&gt;
&lt;p&gt;第一是屋面、外墙面的防渗漏。&lt;/p&gt;
&lt;p&gt;第二是桩基施工。&lt;/p&gt;
&lt;h2&gt;第6节 水、文地质条件&lt;/h2&gt;
&lt;p&gt;主要依据为建设方提供的《湖北省国家安全厅住宅楼岩土工程勘测报告》。&lt;/p&gt;
&lt;h2&gt;第7节 气象条件&lt;/h2&gt;
&lt;p&gt;本地区常年冬季平均气温较低，一般雨雪天气为-2℃左右。夏季气温较高，七、八、九三个月平均气温可达30℃以上，常年雨期多集中在春、秋两季，春、夏之交五月中旬--六月中旬为长江流域梅雨季节，秋季雨期基本在十一月份。从最近十年累年气象资料，本地区冬季施工中的气候，雨雪、低温、冻害影响较小。&lt;/p&gt;
&lt;h2&gt;第8节 施工条件&lt;/h2&gt;
&lt;p&gt;本建筑物地处武汉市武昌区八一路甲一号，交通较为便利，整个现场已经实现&amp;quot;三通一平&amp;quot;。整个施工现场实行封闭式施工，周围的办公房屋和居所较多，主要材料、设备的运输要做好计划安排,环境保护、防止噪声污染等措施药周密齐全，严格落实到位。&lt;/p&gt;
&lt;p&gt;1、基坑开挖前必须做好施工现场的排水措施。&lt;/p&gt;
&lt;p&gt;2、基坑开挖要采取快速施工，因此，要采取机械挖土和人工挖土两种方式相结合施工。施工过程中，要防止基底土受到扰动。&lt;/p&gt;
&lt;h1&gt;第3章 现场平面布置&lt;/h1&gt;
&lt;h2&gt;第1节 平面布置原则&lt;/h2&gt;
&lt;p&gt;平面布置力求科学、合理，充分利用所提供的场地资源，最大限度的满足施工需要，确保既定的质量、工期、安全生产、文明施工等目标的实现。&lt;/p&gt;
&lt;h2&gt;第2节 施工现场平面布置图&lt;/h2&gt;
&lt;p&gt;《施工现场平面布置图》见附件，临时设施布置及设施表参见附件。&lt;/p&gt;
&lt;h2&gt;第3节 施工道路&lt;/h2&gt;
&lt;p&gt;根据现场平面布置图和现场的实际情况，按场地内原来的自然排水坡向，对场地进行平整，修筑宽3.5米现场临时道路。现场路基铺100毫米厚寸口石，压路机压实，路面浇100毫米厚C15混凝土，纵向坡高2%。&lt;/p&gt;
&lt;h2&gt;第4节 材料堆放&lt;/h2&gt;
&lt;p&gt;为了保证现场材料堆放有序，堆放场地将进行硬化处理，即钢筋、模板、砂石料、砖、周转料场等浇成一块面积较大的砼场地。材料尽可能按计划分期、分批层供应，以减少二次搬运。主要材料的堆放，应严格按照《施工现场平面布置图》确定的位置堆放整齐。&lt;/p&gt;
&lt;h2&gt;第5节 环境保护&lt;/h2&gt;
&lt;p&gt;根据工程及工程施工需要，在现场设置洗涤池以方便进出施工现场的车辆冲洗干净。在基础施工时设置相应数量的沉淀池以将其泥浆沉淀，作到清水排入市政管网。在场区内遇到较为干燥的环境时应每隔一定时间撒水一次，并设专人对其实施。在整个的施工工程中，其中产生的建筑垃圾和生活垃圾应及时清运或者在现场设置一到两个垃圾坑存储垃圾并定期进行处理。&lt;/p&gt;
&lt;h2&gt;第6节 施工用电&lt;/h2&gt;
&lt;p&gt;根据施工现场临时用电设计的规定，由电气工程师对施工临时用电进行设计。&lt;/p&gt;
&lt;p&gt;1、本工程施工临时用电系统采用380/220伏三相五线制(TN-S系统)，以保证安全用电。&lt;/p&gt;
&lt;p&gt;2、施工电源由建设单位提供，直接引入施工临时配电房。&lt;/p&gt;
&lt;p&gt;3、在临时发配电房处设一组接地电阻小于4欧姆的发电机保护接地装置， 专用接零保护线和发电机、配电柜外壳接地应与发电机保护接地连接在一起。在配电线路的中间处和末端处做重要接地，接地电阻≤10欧姆。&lt;/p&gt;
&lt;p&gt;4、配电房低压配柜分3个回路(P1-P3)控制施工现场各用电设备。&lt;/p&gt;
&lt;p&gt;P1回路供钢筋加工棚、搅拌棚（砂浆）、机修房等用电。&lt;/p&gt;
&lt;p&gt;P2回路供砼泵、塔吊、楼层施工工作面用电。楼层施工用电从管道井内向上垂直敷设，每层设一个分配电箱。&lt;/p&gt;
&lt;p&gt;P3回路供施工现场照明和办公、食堂等临时设施照明。 导线沿墙明设，过大门时，穿钢管保护。&lt;/p&gt;
&lt;h2&gt;第7节 垂直运输机械的布置&lt;/h2&gt;
&lt;p&gt;根据现场情况和建筑物的结构设计及整体布局，垂直机械分阶段布置如下：&lt;/p&gt;
&lt;p&gt;基础与主体施工阶段：在该建筑物的中间部分安装一台QTZ80塔吊，臂长R=50m，最小起重量为1.8t，以此解决垂直、水平运输问题。&lt;/p&gt;
&lt;p&gt;装饰装修施工阶段：拆除塔吊，在建筑物旁边的东、西部各安装1台快速人货电梯，解决垂直运输问题。&lt;/p&gt;
&lt;h1&gt;第4章 总体施工部署&lt;/h1&gt;
&lt;h2&gt;第1节 管理目标及承诺&lt;/h2&gt;
&lt;h3&gt;1. 质量目标及承诺&lt;/h3&gt;
&lt;p&gt;本工程的质量目标 。如达不到目标，处罚 。&lt;/p&gt;
&lt;p&gt;公司相关各级部门及项目经理部全体人员都对工程的质量高度重视，在总结类似工程施工经验的基础之上，积极努力的推行&amp;quot;质量第一、信誉至上&amp;quot;的原则，运用科学的管理方法，制定严格的质量控制措施，大力采用新工艺、新技术和新材料，做到精心组织、精心施工，将本工程建成优质工程、精品工程，让建设方满意。&lt;/p&gt;
&lt;p&gt;同时采用全面质量管理方法对施工质量进行系统控制，严格执行ISO9000标准进行管理，全方位加强管理工作，保证工程质量，对暴露出的质量薄弱环节实行PDCA循环质量管理方式。&lt;/p&gt;
&lt;p&gt;分部分项工程验收合格并一次性通过，检验批全部验收合格，并实行工程质量奖罚制度。&lt;/p&gt;
&lt;h3&gt;2. 工期目标及承诺&lt;/h3&gt;
&lt;p&gt;确保395天内完成合同范围内的工作内容，相关承诺 。（人力不可抗拒的因素除外）&lt;/p&gt;
&lt;p&gt;根据投标文件的工期要求为420天，为了尽早达到工期要求，满足建设方的愿望，施工工期按投标文件工期以及施工方案安排，本工程的工期定为395天。&lt;/p&gt;
&lt;h3&gt;3. 安全目标&lt;/h3&gt;
&lt;p&gt;杜绝死亡,避免重伤,减少轻伤，无重大设备事故。安全生产创建安全优良现场。&lt;/p&gt;
&lt;h3&gt;4. 现场文明施工管理目标&lt;/h3&gt;
&lt;p&gt;按建设部达标现场要求结合市现场达标标准，确保市文明优良工地，争创文明样板工地。&lt;/p&gt;
&lt;h3&gt;5. 机械设备完好率和利用率&lt;/h3&gt;
&lt;p&gt;积极做好现场机械设备的维护、维修和保养工作，保证机械设备良好的工作状态，并充分利用时间和空间，提高机械化施工程度，机械设备完好率达到95%，利用率达到75%。&lt;/p&gt;
&lt;h3&gt;6. 科技进步目标&lt;/h3&gt;
&lt;p&gt;根据本工程的结构特点、质量、工期等方面的要求，只有采用先进的施工技术和方法，才能实现预期的目标。&lt;/p&gt;
&lt;p&gt;严格执行ISO9000标准进行管理，全方位加强管理工作，保证工程质量。在钢筋的连接上采用现行的新工艺、新技术;使用新型的混凝土成型技术，提高混凝土的观感质量;同时我们在其它方面采用新技术、新材料、新工艺等。其具体的项目有如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;钢筋连接接头施工工艺。&lt;/li&gt;
&lt;li&gt;混凝土高效外加剂的应用。&lt;/li&gt;
&lt;li&gt;推广现代管理技术与计算机应用。&lt;/li&gt;
&lt;li&gt;推进项目管理信息化建设。&lt;/li&gt;
&lt;li&gt;清水混凝土的运用。&lt;/li&gt;
&lt;li&gt;推行先进的质量管理模式。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对于本项目，我司将其纳入公司快速实施、重点保证工程，充分发挥我公司的灵活快速的综合施工能力，依照《建设工程项目管理规范》，实施编制&amp;quot;项目管理规范大纲&amp;quot;和项目管理实施规划、项目进度控制、项目质量控制、项目安全控制、项目成本控制、项目人力资源管理、项目材料管理、项目机械设备管理、项目技术管理、项目资金管理、项目合同管理、项目信息管理、项目现场管理、项目组织协调、项目竣工验收、项目考核评价、项目回访保修等内容，一同实行项目法施工。&lt;/p&gt;
&lt;p&gt;实施《建设工程项目管理规范》的各项条款，实行必要的人、财、物集中统一调度和供应。对本工程采用实用的施工方法和施工工艺，实行科学管理和全面质量管理，并结合质量体系系列标准及本公司质量手册和程序文件要求现场进行施工管理，优化劳动组合，实行高效率、快节奏、高质量、低消耗的工作制度，确保工程顺利进行，以达到如下管理目标：&lt;/p&gt;
&lt;h2&gt;第2节 施工总体安排&lt;/h2&gt;
&lt;h3&gt;1. 土建施工总体安排&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;按先地下、后地上、先主体、后围护、先粗装修后精装修的原则组织施工，及时进行结构验收，尽早形成工作面，组织主体交叉作业，有利缩短工期。柱、墙模板的配置考虑使用5-6次。特别屋面混凝土的施工按照要求不留设施工缝。&lt;/li&gt;
&lt;li&gt;在工程施工时，要安排好各工序搭接的同时按照工序需要作好所须资源的全面就位。&lt;/li&gt;
&lt;li&gt;在土方开挖阶段及时组织足够的劳动力修理边坡，确保基坑槽的边坡不塌方。如基坑槽的验收不受相关条件的限制，基础土方与砼垫层施工采取交叉作业，各区进行清土、验槽、浇砼垫层，以保证持力层基底土不被雨水浸泡受扰动或是人为的扰动。&lt;/li&gt;
&lt;li&gt;本工程为高层建筑物，可考虑对结构工程进行中间结构验收。结构施工中，合理安排工序穿插及预埋件的埋设。&lt;/li&gt;
&lt;li&gt;水电、设备等预留、预埋安装时，要紧密配合土建施工进度，积极组织穿插交叉作业，做好水、电管线的预埋预留工作，在装修阶段做好安装调试工作。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 安装施工总体安排&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;安装工程施工穿插在土建施工中，工期严格执行土建的工期安排，严格按全过程管理体系标准组织施工。&lt;/li&gt;
&lt;li&gt;结构施工阶段：安装部分配合搞好电气管线的予埋工作，防雷接地系统的施工并做好测试记录；水施部分的留洞，各种套管的预埋。&lt;/li&gt;
&lt;li&gt;油漆施工阶段：电气和水施配合土建进度安装各种用电器具、卫生洁具和各种设备，按图纸和规范要求进行各种系统的调试工作，迎接有关部门的验收。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 施工任务划分&lt;/h3&gt;
&lt;p&gt;土建以本公司自有施工协作队伍为主，组织成二支队伍，在工程两施工段的施工中，按二班制组织施工。在大面积进入装修及设备安装时，另从公司范围内组织专业施工队进场。装修施工可在已经完成工作面插入，此外，桩基工程、水、电等专业均由本公司专业公司承担，土建从土方开挖时就做好施工配合。&lt;/p&gt;
&lt;h3&gt;4. 施工组织原则&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;地面以下以桩基工程施工为重点，要特别抓好桩孔积水的排水处理，以及基坑边坡的支护。&lt;/li&gt;
&lt;li&gt;地面以上以主体阶段施工为重点，则要抓住模板、钢筋、砼的施工。主体结构完成后，则以建筑物的每层组织承包，按二支队伍齐头并进的原则。由于采用上述原则，材料部门要积极组织好材料、半成品的订货、进货、材料试验及验收，加强材料的质量管理，并按施工计划组织好材料的进场。另外还应与当地建材质量检测单位签订好材料检测合同以确保进场材料在使用前受控。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第3节 分包工程情况&lt;/h2&gt;
&lt;p&gt;本公司对所承建的各分部分项工程不转包，所有承包范围内工程的施工全部由自己完成，施工管理人员在公司内部精选，对建设方分包的分部分项工程，全力作好配合，确保工程施工顺利进行。&lt;/p&gt;
&lt;h2&gt;第4节 总体施工程序&lt;/h2&gt;
&lt;p&gt;按照：放线→桩位成孔→桩护壁→桩身施工→桩基验收→承台地梁基坑（槽）土方开挖→基槽验收→承台地梁施工（安装工程的预埋）→基础验收→基础砌体→基坑回填→主楼结构→（插入安装工程预埋）→屋面工程→进入装修→设备安装、调试→竣工的程序，组织流水施工。由于本工程工期较紧，因此，工程开工进场以后，要以最短的时间做好施工准备工作。另附总体施工程序框图参见附件。&lt;/p&gt;
&lt;h2&gt;第5节 施工管理机构及相关人员资历构成&lt;/h2&gt;
&lt;p&gt;本工程所需材料、人员、设备拟由公司生产经理全面协调，并由公司总工对本工程实施技术直控，公司的各职能部门对本工程的相关专业进行监督检查、指导，根据公司管理目标，选派具有丰富施工经验和高度责任心的同志担任该工程项目经理。同时向建设方承诺：针对此工程项目，我公司推选的项目班子成员一律持证上岗、押证施工。&lt;/p&gt;
&lt;p&gt;在项目经理的领导下，保证完成生产、质量、安全、文明施工等目标，项目经理负责进行全面领导和协调工作，根据进度计划，进行施工队伍、材料组织、工序搭接的总体安排，以保证现场合理的施工秩序。现场管理组织机构框图见附件。&lt;/p&gt;
&lt;p&gt;根据项目的管理体系，结合本工程实际情况，在全司范围内通过岗位竞争，优化选择项目主要管理人员，该项目部采用老、中、青相结合的方式，将各方的优势有机的结合，形成强有力的项目班子。其项目部的主要人员均来自施工生产管理第一线的骨干力量，年富力强、精力充沛，而且专业技术水平强。他们技术素质较高、施工经验丰富、思想素质过硬，并能吃苦耐劳、长期坚守在岗位上。&lt;/p&gt;
&lt;p&gt;根据本工程各方面的情况及特点，有针对性的组建项目班子，并且其人员一旦经过甲乙双方确认，全班人选将处于启动状态，未进场之前，可根据设计要求积极为本工程做好开工前的准备工作（材料、机械、技术等准备工作与策划工作），并且以满足工程需要为前提，未经建设方同意中途更换人员，谨此愿接受建设方的处罚。&lt;/p&gt;
&lt;p&gt;根据项目经理部的工作实际，具体明确每个项目管理人员的责、权利，使全体管理人员有条不紊开展工作，从而较大幅度的提高项目经理部的工作效率，有效的促进整体管理实力，使项目经理部的管理体系有更多的精力和时间来分析运筹各种复杂的管理局面，做到项目整体下活一盘棋，充分发挥每个人的作用，使决策做到有的放矢。&lt;/p&gt;
&lt;p&gt;以已制定的各项项目管理制度来指导、督促、规范每个管理人员的工作质量、效率。变&amp;quot;人管理人&amp;quot;&amp;quot;人盯人&amp;quot;为&amp;quot;制度管理人&amp;quot;，作到项目管理&amp;quot;有章可循、执法必严、违章必究&amp;quot;，这样形成精诚团结的团队精神、赏罚分明的管理模式。&lt;/p&gt;
&lt;p&gt;我公司的项目管理一向将项目的职业道德作为专项考核制度，并在项目管理中大力提倡和推广，我们将一如既往地实施这一制度，具体做法是把项目施工职业道德的具体含义、标准分解落实到项目每个管理人员和操作人头上并与他们的收入挂钩，形成了自觉抵制施工质量和材料质量上的以次充好、偷工减料、弄虚作假等不良行为的企业文化，施工质量做到建设方是否在场都一个样，让建设方和用户放心享受精品工程的高品质使用价值。&lt;/p&gt;
&lt;p&gt;其二、我们也拟定了施工组织机构高效运作保障措施。建立健全项目经理、工长、内业、材料、机械、劳资等岗位责任制，由公司的各相关部门定期对各专业进行考核。实施激励约束机制、工程例会、现场督办制度、继续教育培训制度、班前培训制度等等。&lt;/p&gt;
&lt;h2&gt;第6节 机械设备配备情况&lt;/h2&gt;
&lt;h3&gt;1. 大型机械投入计划&lt;/h3&gt;
&lt;p&gt;a 塔 吊　　　　 1台&lt;/p&gt;
&lt;p&gt;b 人货电梯 2台&lt;/p&gt;
&lt;p&gt;c 砼搅 拌机 1台（供混凝土零星搅拌使用）&lt;/p&gt;
&lt;p&gt;d 砂浆搅拌机　　 5台&lt;/p&gt;
&lt;p&gt;e 反铲挖掘机 1台&lt;/p&gt;
&lt;p&gt;f 砼输送泵 1台&lt;/p&gt;
&lt;p&gt;g 混凝土运输车 6辆&lt;/p&gt;
&lt;h3&gt;2. 机械设备的组织供应&lt;/h3&gt;
&lt;p&gt;施工机械设备，由项目经理部根据施工进度计划及工程量提出机具设备需用计划。在公司经理统一指挥下，由有关部门按计划时间组织进场，并进行安装调试，经相关职能部门组织验收后，能确保正常使用时准予使用。其它施工机具随施工分项的不同分批进场。在此项目的整个机械设备投入情况详见附件。&lt;/p&gt;
&lt;p&gt;本工程施工机械分为两类：一类为运输机械，另一类为加工机械。在本工程进入多工种交叉作业时，垂直运输机械的调配和利用，将成为影响工程进度的主要矛盾，项目经理部将根据工程进展及工程需要认真研究、充分利用、合理安排。&lt;/p&gt;
&lt;p&gt;在整个施工过程中，项目拟建一个施工机电设备组加强机械的保养和检查。定期检查，及时解决问题，使现场施工机械在整个施工期保持良好的运输状态。&lt;/p&gt;
&lt;p&gt;加工机械安全操作要求均按照有关机械设备操作规程进行施工作业，并将其安全防护装置设置齐全。&lt;/p&gt;
&lt;p&gt;施工机械是保证工程施工按预期目标进行的重要设施，是加快工程进度、提高工程质量的必要配置。其各种配套的施工技术资源及手段都应满足本工程技术指标的要求，其机械设备的调配将由公司经理亲自协调处理，确保以施工进度计划要求按期入场，满足工程施工需要。&lt;/p&gt;
&lt;h2&gt;第7节 主要材料投入计划&lt;/h2&gt;
&lt;h3&gt;1. 周转材料投入计划&lt;/h3&gt;
&lt;p&gt;根据本工程的工程特点及工程量，以经济实用的原则，对主要的周转材料作如下选择，具体详见下表：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主要周转材料投入计划表&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;材 料 名 称&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;单 位&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;数 量&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;备 注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;Φ48钢管&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;t&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;195&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;内外架、防护设施等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;十字扣件&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;套&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;15000&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;与钢管配套使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;接头卡&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;套&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5000&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;与钢管配套使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;旋转卡&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;套&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5000&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;与钢管配套使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;组合钢模&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;平方米&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;剪力墙、梁支模&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;回形卡&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;个&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;与钢管配套使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;15mm胶合板&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;平方米&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3500&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;板底支模、梁模&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;绿色安全网&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;平方米&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8000&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;防护架、提升架围护&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;木枋&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;立方米&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;300&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;用于支模板底搁栅等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5cm厚跳板&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;立方米&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;600&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;用于脚手架板、安全通道等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;11&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;安全平网&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;平方米&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1000&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;用于安全水平防护&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;早拆体系头&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;个&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;700&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;与钢管配套使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;13&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;木模板&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;M^2^&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2000&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;周转材料选择及投入计划大致按如下配置方式：&lt;/p&gt;
&lt;p&gt;墙模板：配置二层半，梁板模板：配置三层；周转次数均为4-6次。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模板选择：本工程的柱、梁、板较多，采用15夹板配模型式较灵活。考虑到工期要求较紧，拟安排一定数量的快拆体系的快拆头。&lt;/li&gt;
&lt;li&gt;所有周材的进场，由项目经理部根据生产进度计划和工程量预先提出材料需用量计划，由主管部门根据工程主体进度需要，分别进场，这样可提高施工现场的使用率及周材的周转次数。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 工程用材料投入计划&lt;/h3&gt;
&lt;p&gt;所有工程用材料均由合格供应商供应，供应材料必须进行验证检验和材料试验。到场材料必须按规定提供材质证明书，经检验合格的材料应按规定进行标识，不合格材料，不得放行和使用。&lt;/p&gt;
&lt;p&gt;主要工程用材在开工前作出材料需用计划，并按进度计划进行分解，工程施工期间按工程进度组织进场，确保工程需要。本工程主要工程用材料见下表：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主要工程用材料计划表&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;项目&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;单位&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;数量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;钢 材&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;t&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;木材&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;工程用&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;M^3^&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;施工用&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;M^3^&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;水 泥&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;t&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;商 品 砼&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;M^3^&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;3. 安全防护用品计划&lt;/h3&gt;
&lt;p&gt;主要安全防护用品计划如下：&lt;/p&gt;
&lt;p&gt;安全网 800床&lt;/p&gt;
&lt;p&gt;安全兜网 180床&lt;/p&gt;
&lt;p&gt;安全防护用钢管 70吨&lt;/p&gt;
&lt;p&gt;安全带 16套&lt;/p&gt;
&lt;p&gt;安全帽 300顶&lt;/p&gt;
&lt;p&gt;绝缘鞋 50双&lt;/p&gt;
&lt;p&gt;绝缘手套 20双&lt;/p&gt;
&lt;p&gt;漏电保护器 15个&lt;/p&gt;
&lt;h2&gt;第8节 劳动力投入计划&lt;/h2&gt;
&lt;p&gt;在施工技术水平可确保质量的前提下, 最大限度的投入人力资源,施工现场精心组织，确保人力资源的最佳使用效率。&lt;/p&gt;
&lt;p&gt;根据我司质量程序文件要求，施工队伍在长期跟公司协作队伍中精选，选择操作熟练、服从管理、技术素质较高的施工作业人员进行施工操作。劳动力配置计划见附件。&lt;/p&gt;
&lt;p&gt;装饰装修、收尾阶段的劳动力组织和管理是直接影响本工程能否顺利完成的一个关键环节，为此我们将采取以下几点措施：&lt;/p&gt;
&lt;p&gt;施工现场项目经理及主办工长做到全盘考虑，认真学习和研究施工图纸，领会设计意图，拟定出本工程各阶段施工所需投入的人力什么时间进场、什么时间退场，做到心中有数，减少盲目性，以免造成不应有有人员紧缺或窝工现象。&lt;/p&gt;
&lt;p&gt;在使用人力上执行竞争上岗的制度，防止出工不出力和返工现象的发生。&lt;/p&gt;
&lt;p&gt;本工程装饰装修收尾时，要教育好我们的工人，特别重视成品保护，防止已完工的部位被损坏和污染，要同各协作单位取得联系，组织足够人员参加保护工作。&lt;/p&gt;
&lt;h2&gt;第9节 主要检测仪器计划&lt;/h2&gt;
&lt;p&gt;主要检测仪器计划详见附件。&lt;/p&gt;
&lt;h2&gt;第10节 劳务分包情况&lt;/h2&gt;
&lt;p&gt;本工程选择选择一个综合劳务承包队伍和其他各专项的专业施工队伍构成一个善于打硬仗的施工作业协作队伍。工程施工时提供详细的相关的资料。&lt;/p&gt;
&lt;p&gt;施工组织总体部署是以土建为主，水电、综合布线、消防、电梯、设备安装配合施工。整个工程的工期主要分为土建的基础施工工期、主体结构施工工期和装饰施工工期三阶段。按分部控制工期，通过平衡协调和调度，确保按计划工期组织施工。&lt;/p&gt;
&lt;p&gt;根据工期的要求将建筑平面划分为两个施工段, A户型的三个单元为一施工段（Ⅰ段），B户型为一施工段（Ⅱ段）。现场施工顺序如下:&lt;/p&gt;
&lt;p&gt;基础阶段: 桩基的施工顺序由建筑平面东面向西面进行施工,然后基础土方开挖、承台、地梁的施工，最后进行基础砌体、土方回填等方面的施工.&lt;/p&gt;
&lt;p&gt;主体阶段:在两个施工段上进行施工作业,先施工Ⅰ段,后施工Ⅱ段,按流水方式组织各层施工.西北角单元为Ⅰ段，东南角单元为Ⅱ段。&lt;/p&gt;
&lt;p&gt;围护、装修阶段: 围护结构可在主体施工过程中插入,这里涉及到中间结构验收,按照工期和相关要求及时组织有关人员进行中间结构验收, 装修在主体完工后插入。&lt;/p&gt;
&lt;h1&gt;第5章 施工协调管理&lt;/h1&gt;
&lt;h2&gt;第1节 与设计院的工作协调&lt;/h2&gt;
&lt;p&gt;工程开工前15天，我们与设计院等相关各方联系，进一步了解设计意图及工程要求，根据施工设计图提出我们的施工实施方案。&lt;/p&gt;
&lt;p&gt;参加施工图会审，协助建设方向设计院提出建议，完善设计内容和设备选型。&lt;/p&gt;
&lt;p&gt;在施工中，及时会同建设方、设计院按照总进度与整体效果要求，验收样板间，进行部位验收、中途质量验收、竣工验收等。&lt;/p&gt;
&lt;p&gt;会同设计院、建设方一起参加设备、装饰材料、卫生洁具等的选型、选材和定货，参加新材料的定样采购。&lt;/p&gt;
&lt;p&gt;协调各施工协作单位在施工中需与监理工程师协商解决的问题，协助设计院解决诸如因多管道并列等原因引起的标高、几何尺寸的平衡协调工作。&lt;/p&gt;
&lt;h2&gt;第2节 与监理工程师工作的协调&lt;/h2&gt;
&lt;p&gt;我公司将积极配合监理工程师及现场监理工程师代表履行他们的责任、义务、权力。&lt;/p&gt;
&lt;p&gt;工程开工后，将根据合同中明确规定的永久性工程图纸、施工进度计划、施工组织设计等文件及时提交给监理工程师批准。&lt;/p&gt;
&lt;p&gt;在施工全过程中，严格按照经建设方及监理工程师批准的&amp;quot;施工组织设计&amp;quot;进行工程的施工管理。在各单位&amp;quot;自检&amp;quot;和专检的基础上，接受监理工程师的验收和检查，并按照监理工程师的要求，予以整改。&lt;/p&gt;
&lt;p&gt;贯彻已建立的质量控制、检查、管理制度，确保产品合格。总承包对整个工程产品质量负有最终责任，任何协作单位工作的失职、失误造成的严重后果，本着对建设方负责也要坚持&amp;quot;四不放过&amp;quot;的原则，因而加大监管和协调力度，杜绝现场施工单位不服从总承包方和监理工程师监理的现象发生。&lt;/p&gt;
&lt;p&gt;所有进入现场使用的成品、半成品、设备、材料、器具，均主动向监理工程师提交产品合格证或质保书，应按规定使用前需进行物理化学试验检测的材料，主动递交检测结果报告，保证所使用的材料、设备合格并满足安全和使用功能的要求。&lt;/p&gt;
&lt;p&gt;严格执行&amp;quot;三检制&amp;quot;，使监理工程师能顺利开展工作。对可能出现的工作意见不一的情况，遵循&amp;quot;各方协调磋商&amp;quot;的原则。&lt;/p&gt;
&lt;h2&gt;第3节 土建、安装的施工配合措施&lt;/h2&gt;
&lt;p&gt;本工程属高层建筑物，其施工按照常规分为四个阶段。&lt;/p&gt;
&lt;p&gt;即：桩基及地基基础施工阶段→主体施工阶段→装饰装修施工阶段→室外总平、安装调试、竣工收尾阶段。&lt;/p&gt;
&lt;p&gt;我们在施工时，每道工序的质量、工期均影响工程的整个施工节奏，所以对工序质量时间控制作为管理重点。主体施工分两施工段流水作业，各段工序熟练，施工速度、质量相对稳定，但因工作面头绪增多，安装管理应及时插入，组织交体交叉流水作业，在此阶段应对设备订货送型，装饰设计可考虑统筹安排，为进入全面装修作好充分准备。所以我公司在总结高层建筑施工经验基础上，对装饰装修策划及总包龙头管理有成套管理制度和技术，即以总包龙头管理为主，各专业协调配合，采取各种管理、技术措施，确保工程的整体效果，现分述如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;以土建为龙头，以统一制度的约束措施来管理现场。凡进入现场施工的各施工专业单位，必须遵守现场管理制度，服从土建统一规划、平衡。在生活、生产加工、施工库房、施工用电、施工用水等方面划分区域，建立施工现场统一指挥协调小组负责协调各专业单位之间的施工程序。建立现场协调会制度，及时解决土建、安装、装饰等专业单位施工中存在的问题及矛盾，并以会议纪要形式，各单位签字、盖章即具备法律效力，对各方均有法律约束效力。&lt;/li&gt;
&lt;li&gt;以统一的施工计划、施工程序规划为指导，确保整个工程优质、高速，按期交付使用。
&lt;ol&gt;
&lt;li&gt;桩基与地基基础、主体施工阶段，安装应紧密配合土建进度，按照设计图纸进行前期的预留预埋工作，土建要配合安装作好隐蔽的预留预埋产品保护，提供准确的测量放线基准。在主体施工阶段，土建砌筑抹灰应按设计图纸预留安装孔洞、槽，并采取在管槽面加设钢丝的防裂缝措施。为保证相互间创造工作面，安装、设备的锚固铁件、连接吊杆等应按土建要求进度提前插入。&lt;/li&gt;
&lt;li&gt;装饰装修阶段，土建每月安排总控制计划，各单位按总计划编制配套作业计划，定期检查计划执行情况，并严格统一签字认可程序。由于装饰装修施工立体交叉作业，所以除计划控制外采取立体工作量，校定表方式，跟踪监督。使各专业单位有一个统一的施工程序和控制程序。&lt;/li&gt;
&lt;li&gt;室外总平、安装调试、竣工收尾阶段，以工作项目内容为基准，采取划分控制点的方式确保后期工作不松懈，工期有保证。同时，为保证顺利竣工，各专业协作单位必须及时提供交工资料，交由总包审核，由现场协调小组统一指挥、监督。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;以统一的技术管理手段及配合措施，强化各专业单位的技术管理及配合意识。
&lt;ol&gt;
&lt;li&gt;土建及时将有关部分项质量控制计划交现场协调小组签发，各专业单位共同执行此计划，确保分项工程质量有计划可循。&lt;/li&gt;
&lt;li&gt;土建、安装等专业单位共同核定图纸，相互对照，将工序矛盾问题消灭在施工图纸阶段。防止返工损失造成工期延误或造成无法恢复的质量隐患。&lt;/li&gt;
&lt;li&gt;加强装饰装修的二次设计工作，确保实现该工程的使用功能和观感功能及整体效果。&lt;/li&gt;
&lt;li&gt;执行统一技术交底制度和规范标准验收制度，加强装饰装修、安装的细部配合处理，特别是卫生间、门窗边框，不同装饰材料的交界面等处理要仔细，统一协商，按程序进行。&lt;/li&gt;
&lt;li&gt;土建应将标高水平控制基准线和墙体位置控制线，轴线控制线弹在墙或柱上，明确水平标高线高度、明确墙体及安装位置平面、明确定位测量基准，由土建测量员统一核定，技术负责人批准。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;同时，土建单位在本工程中使用计算机以实现整个工程的系统管理。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;采用微机控制总工期及各阶段、各专业单位控制工期的动态管理。&lt;/li&gt;
&lt;li&gt;采用微机实现立体交叉作业的工作量模块控制形象管理。&lt;/li&gt;
&lt;li&gt;采用微机实现整个工程的质量控制计划，并实现全方位监督指示。&lt;/li&gt;
&lt;li&gt;采用微机提高现场协调小组的工作效率和信息传递。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为有效的实施施工协调管理，采取统一资金控制手段和奖惩手段，协调、监督、控制施工各单位的协调配合及工作完成进度、质量状况。经济手段是最根本、最现实、最有力的手段，其它手段、措施的落脚点在于经济手段与技术手段的有效运用。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;土建、安装等专业单位当月完成量应统一交由现场协调小组审核，最后交建设单位校准批示，作为拨付进度款的依据。&lt;/li&gt;
&lt;li&gt;根据工作完成计划，检查各专业单位是否按总进度计划要求及总控制质量计划要求完成统一规划工作面上的工作内容。&lt;/li&gt;
&lt;li&gt;对完成工作较好，质量、进度保证，与其它作业队伍配合较好的作业单位，给予一定奖励，对于完成较差的单位给予一定惩罚，对特别差的单位采取强制手段或作为合同违约并与合同配套执行。&lt;/li&gt;
&lt;li&gt;在物质奖励的同时，现场建立评比专栏，公布质量、进度、配合评比打分情况，开展作业竞赛活动，此方法是相当行之有效的。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;建立成品保护制度和施工服务制度，各施工队伍单位共同遵守，达成共识。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;各作业单位均在进场时接受统一的入场教育，并分别进行作业人员的成品保护意识教育，互相尊重劳动成果。&lt;/li&gt;
&lt;li&gt;大型设备安装，特殊设备搭架、吊运等土建应积极配合、互相协商，竖立服务第一的观点，确保施工工序的衔接紧凑。&lt;/li&gt;
&lt;li&gt;楼层设置统一的监督员、楼层监视员，发现有人违章作业，破坏成品应及时阻止，并交现场协调小组处理。&lt;/li&gt;
&lt;li&gt;采取必要的成品保护措施（参见成品保护措施内容）。&lt;/li&gt;
&lt;li&gt;所有参建单位主要负责人，施工人员均应按时参加协调会，并建立指挥、通讯、联络体系，打成表格，人手一份。&lt;/li&gt;
&lt;li&gt;除以上配合措施外，建立协调的合作关系和树立互相服务、支持工作的良好作风是整个工程顺利完成、达到预定目标的前提，所以，各单位应互相尊重、互相学习、取长补短、共同进步，以实现共同目标。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;现场协调管理网络示意图如下：&lt;/p&gt;
&lt;p&gt;建设单位&lt;/p&gt;
&lt;p&gt;现场协调小组&lt;/p&gt;
&lt;p&gt;土建&lt;/p&gt;
&lt;p&gt;装饰装修&lt;/p&gt;
&lt;p&gt;消防&lt;/p&gt;
&lt;p&gt;给、排水&lt;/p&gt;
&lt;p&gt;强电弱电&lt;/p&gt;
&lt;p&gt;安装&lt;/p&gt;
&lt;h2&gt;第4节 施工协调配合&lt;/h2&gt;
&lt;p&gt;本工程因其结构特点存在着多工种、多项目、多部位交叉作业。为了保证操作面的宽松而又能有效地利用，使操作工人紧张而有序的工作，水平及垂直运输平稳而又能满足施工需求，使整个现场施工有条不紊的进行，特制定如下制度：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;现场项目经理、施工工长应从施工机械的有效利用及操作着手、合理、科学的调配劳动力，各工种、各作业班组应本着局部服从整体原则；辅助工序、穿插工序给关键工序让路的原则，服从项目经理部的统一管理，统一调配。&lt;/li&gt;
&lt;li&gt;项目经理部每日及时召开&amp;quot;碰头会&amp;quot;，由项目生产副经理主持，及时安排当日工作协调事项和解决施工问题。&lt;/li&gt;
&lt;li&gt;每周定期召开一次施工现场协调会，建设单位有关人员和现场监理主持参加，对整个项目施工进行阶段性协调工作。广泛听取各部分项目工程及其他负责人的汇报、要求和意见。考虑整体形象进度以及质量目标等因素，综合平衡工程施工的每个具体环节。&lt;/li&gt;
&lt;li&gt;现场生产管理部门，作出切实实际的配合作业计划，安排好各分部分项、各工种之间的工作内容、工作时间、工作地点，尽可能避免工作存在同一时段范围内重叠。&lt;/li&gt;
&lt;li&gt;项目经理实行阶梯统一管理模式。现场施工由项目生产经理统一安排、统一协调。项目生产经理的工作安排应科学、合理、周密。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;第6章 施工进度计划&lt;/h1&gt;
&lt;h2&gt;第1节 主要工序&lt;/h2&gt;
&lt;p&gt;基础工程：采取由下而上的施工顺序施工。&lt;/p&gt;
&lt;p&gt;主体结构：施工时，采取平行流水施工。&lt;/p&gt;
&lt;p&gt;装饰工程：结构完成之后，由建设方组织有关单位对结构工程质量检查验收，验收合格后，方可进行其他工序的施工。施工时，自上而下进行内装修，待女儿墙压顶完成后，自上而下进行外装饰。室内外装饰先内部、后外部。&lt;/p&gt;
&lt;h2&gt;第2节 进度计划监督管理&lt;/h2&gt;
&lt;p&gt;为了保证工程按期完成，我公司坚持施工进度计划监督管理。并根据工程的实际情况制定工程年、季、旬、月、周作业计划及相应进度统计报表，按进度计划组织施工，接受建设方代表、监理对进度的检查、监督。&lt;/p&gt;
&lt;h2&gt;第3节 施工进度计划&lt;/h2&gt;
&lt;p&gt;根据总体施工部署，从全局考虑，阶段内的各分项工程按工序的衔接、工序的先后顺序等综合考虑安排施工，交叉作业，生产上互不干扰，项目部统筹兼顾，协调工程的资金、劳动力、材料，以保证工程能按施工进度计划完成。工程各分部分项工程时间安排如下：&lt;/p&gt;
&lt;p&gt;总工期395天,其中&lt;/p&gt;
&lt;p&gt;桩基工程 90天&lt;/p&gt;
&lt;p&gt;基础工程 30天&lt;/p&gt;
&lt;p&gt;主体结构 120天&lt;/p&gt;
&lt;p&gt;砌体工程 50天&lt;/p&gt;
&lt;p&gt;屋面工程 30天&lt;/p&gt;
&lt;p&gt;装修 90天&lt;/p&gt;
&lt;p&gt;竣工验收 10天&lt;/p&gt;
&lt;p&gt;以上不含砌体施工插入主体结构25天。&lt;/p&gt;
&lt;p&gt;施工进度网络计划见附件。&lt;/p&gt;
&lt;p&gt;施工进度横道图见附件。&lt;/p&gt;
&lt;p&gt;结构工程的施工周期较长， 且易受自然气候的影响，当进入基础高峰施工以后，人员、设备的运转日趋正常，为确保阶段工期的实现，分项工程工期按以上各个阶段进行综合控制。&lt;/p&gt;
&lt;p&gt;本工程施工全过程有桩基工程、基础及结构工程、建筑装饰装修工程、建筑屋面工程、建筑给水排水工程、建筑电气工程等，各分部分项工程的施工均按总的施工进度安排计划进行。&lt;/p&gt;
&lt;h1&gt;第7章 施工准备&lt;/h1&gt;
&lt;h2&gt;第1节 施工准备工作程序&lt;/h2&gt;
&lt;p&gt;签定施工合同→项目班子进场→机具、人员、临设、方案、图纸会审、质保计划→开工报告。&lt;/p&gt;
&lt;h2&gt;第2节 技术准备&lt;/h2&gt;
&lt;h3&gt;1. 标准准备&lt;/h3&gt;
&lt;p&gt;项目技术负责人根据图纸设计要求，拟定有关规范、标准、图集清单，并予以配齐，以确保现场施工依据的齐全与正确。&lt;/p&gt;
&lt;h3&gt;2. 合同交底&lt;/h3&gt;
&lt;p&gt;在工程合同签订以后，由公司有关部门就合同条款内容，对项目经理进行有关工期、质量、安全、经济结算进行交底，项目经理对项目成员进行上述内容交底。&lt;/p&gt;
&lt;h3&gt;3. 编制施工阶段施工组织设计&lt;/h3&gt;
&lt;p&gt;现场技术负责人组织各工种工长及质检员对施工图纸进行预审，并结合现场实际情况及合同规定工期及质量要求对本施工组织设计进一步细化，编制实施性施工组织设计。&lt;/p&gt;
&lt;h3&gt;4. 编制质量保证计划&lt;/h3&gt;
&lt;p&gt;本工程实施施工时由项目经理主持编制质量计划，以体现从工序、分项工程、分部工程到单位工程的过程控制、体现从资源投入到完成工程质量最终检验和实验的全过程控制，并成为对外质量保证和对内质量控制的依据。&lt;/p&gt;
&lt;p&gt;所编制质量保证计划的质量控制按附件所述程序实施。其中在施工准备阶段质量控制方面作到：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;收集、研究本工程的地质勘察报告，到市气象局咨询施工阶段气候状况，事先作好交通运输状况和材料供应情况调查、了解。&lt;/li&gt;
&lt;li&gt;现场施工的施工组织设计能起到充分指导现场施工，并且全面细致。&lt;/li&gt;
&lt;li&gt;了解、掌握有关质量管理方面的法律、法规性文件及质量验收标准。&lt;/li&gt;
&lt;li&gt;收集整理由建设方给出的原始基准点、基准线、参考标高的数据资料，编制、整理、核查本工程需要的施工控制网。&lt;/li&gt;
&lt;li&gt;对设计施工图纸进行充分而细致的释读、分析，明晰其设计施工意图，特别是基础处理、结构、设备安装和调试等要深入认识和控制。&lt;/li&gt;
&lt;li&gt;图纸会审方面，所施工用的图纸是否满足相应的资质、图纸与说明是否齐全、图纸中有无遗漏差错或相互矛盾之处以及图纸表示方法是否清楚并符合标准要求、对所提供的施工方法的合理性进行认证、在施工前备齐本工程所需要的各种标准、规范、图册、规程等。&lt;/li&gt;
&lt;li&gt;在物资采购、协作服务等方面合理化的要求，所采购产品实施多种验证方式：厂家绩效考核、进货检验（复验）等。&lt;/li&gt;
&lt;li&gt;对项目管理人员、班组施工人员进行有效质量教育和培训。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本工程施工阶段、竣工验收阶段的质量控制在工程施工时对技术交底、测量控制、材料控制、机械设备控制、环境控制、计量控制、工序控制、特殊过程控制、工程变更控制、成品保护、最终质量检验和试验、技术资料的整理、施工质量缺陷的处理、工程竣工文件的编制和移交准备、产品防护、撤场计划拟出与工程相适应的要求、目标、措施。&lt;/p&gt;
&lt;p&gt;根据项目的需要及质量目标要求，结合施工现场实际，综合考虑施工各个环节，由技术负责人组织项目人员编制本工程质量保证计划，质量保证计划结合通用的国际质量标准要求及本公司要求，对本工程质量从全方位进行控制，其实施的结果也可以在实施的施工组织设计体现。&lt;/p&gt;
&lt;h3&gt;5. 技术交底&lt;/h3&gt;
&lt;p&gt;技术交底采用三级制。技术负责人→工长→班组长。技术负责人向工长交底，要求细致齐全。并要结合具体操作部位,关键部位的质量要求、 操作要点及注意事项等进行交底。对于有关文件要求确定的关键工序和特殊过程，要从人、机、料等多个方面进行细致交底，对所涉及的新技术、新工艺，必须对具体做法予以交底。除口头和文字交底外，必要时采用图表、样板、示范操作等方法交底。班组长在接受交底后，应组织工人进行认真讨论，保证明确施工意图。&lt;/p&gt;
&lt;h3&gt;6. 图纸会审&lt;/h3&gt;
&lt;p&gt;由项目经理及技术负责人组织现场施工技术人员及专业工长认真看图，提出问题。组织设计单位及其它相关单位一起进行图纸会审，对图纸中不明确和有疑问的部分及时与设计方沟通，确保施工中不必要的返工和浪费。&lt;/p&gt;
&lt;h3&gt;7. 编制施工预算&lt;/h3&gt;
&lt;p&gt;编制施工预算，根据工程量，按施工各阶段将所需材料用量进行分解，对工程成本情况进行预计。&lt;/p&gt;
&lt;h2&gt;第3节 资源准备&lt;/h2&gt;
&lt;h3&gt;1. 施工队伍组织&lt;/h3&gt;
&lt;p&gt;项目生产组根据施工进度计划及施工各阶段工程量拟定进场施工队伍专业、数量、进场时间计划，报相关部门，根据公司合格劳务分承包方的情况，选择施工队伍，实施内部竞争上岗。并根据工程特点，在专业施工队的基础上，组建混合班组。混合班组由多工种组成,这一组织形式便于统一指挥,协调施工，有利于加速工程进度和提高工程质量。&lt;/p&gt;
&lt;h3&gt;2. 材料、机具按计划进场&lt;/h3&gt;
&lt;p&gt;根据施工组织设计及工程预算所需材料的分阶段需用量，提供材料需用量计划、机械设备需用量计划。公司主管部门审核后，迅速组织材料、机具设备进场计划，并组织人员落实调配材料、机具设备进场计划，确保按计划进场，保证施工需要。&lt;/p&gt;
&lt;h2&gt;第4节 现场准备&lt;/h2&gt;
&lt;h3&gt;1. 场地交接&lt;/h3&gt;
&lt;p&gt;进入施工现场以后，首先对场地现状进行交接。另外进场后，对排水明沟等设施及时完善，并做好钢筋冷拉设备基础的施工准备。&lt;/p&gt;
&lt;h3&gt;2. 施工用水&lt;/h3&gt;
&lt;p&gt;现场施工用水主要为砼施工，砌体施工和装修工程施工用水，根据计算以及类似工程施工经验，用水量可按消防用水量8L/s设计。水源由建设方供水管道引出，干管选用Φ63钢管（或Φ50），管网布置见施工平面图，埋深 0.50m，在现场设置施工消火栓一个，灭火器六个。主体施工时，设立管上引，供每层楼面施工用水，另外，每层设一道截止阀及接口。&lt;/p&gt;
&lt;p&gt;支管选用Φ48钢管，分支管选用DN25水管供各用水点。&lt;/p&gt;
&lt;h3&gt;3. 施工用电&lt;/h3&gt;
&lt;p&gt;现场施工机械用电量见《主要机械设备计划表》。&lt;/p&gt;
&lt;h3&gt;4. 施工道路&lt;/h3&gt;
&lt;p&gt;按前面叙述要求执行。&lt;/p&gt;
&lt;h3&gt;5. 现场防护&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在工程外围设立临时施工围墙，工程采取封闭式施工管理。&lt;/li&gt;
&lt;li&gt;环境防护：本工程地处八一路甲一号，其施工期间的噪声、振动对周边环境影响较大。另外，有大量土方及建材运输，对环境卫生影响较大。按照文明施工的相关叙述执行。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6. 临时设施&lt;/h3&gt;
&lt;p&gt;临时设施：按照文明施工现场要求和施工平面布置图，认真组织搭设。&lt;/p&gt;
&lt;p&gt;临时水、电、管网铺设：施工用的水、电按临时用水用电施工要求接入现场。&lt;/p&gt;
&lt;p&gt;临时环境考察：及时与建设方及有关部门联系，对施工现场的地下管网、人防设施、周边环境交通运输道路状况、交通峰值状况进行了解，做到心中有底，避免施工中陷入被动。&lt;/p&gt;
&lt;p&gt;现场清理和测量放线：由技术负责人组织有关人员进行测量定位，对土方标高、周边尺寸预以核实，并作好记录，及时请建设方复核签证。&lt;/p&gt;
&lt;h1&gt;第8章 施工测量&lt;/h1&gt;
&lt;h2&gt;第1节 施工测量的控制&lt;/h2&gt;
&lt;h3&gt;1. 工程平面控制&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;控制点的选取
土方开挖前，要作好工程测量控制，根据工程场地实际情况，±0.000以下采用主轴线控制法，测设和作好建筑位置控制桩，±0.000以上采用内控法为主，外控法为辅的测设方法。具体以住宅楼1轴线、7轴线、14轴线、35轴线、46轴线以及A、G、K、L等轴线设置控制桩点，形成方格网形主轴线平面控制方案。控制点设在已有建筑物墙上或作地面控制桩。&lt;/li&gt;
&lt;li&gt;控制点的定位
以城市规划或建设单位指定的一个红线桩和一条红线边为准用直接测法，进行测设平面控制桩。经过闭合后达到要求精度，即为平面控制标桩。并据此测量出建筑物各轴线。控制点测定后，在已有建筑物墙上的，应用红三角标记和注明轴线号；地面上的控制点用砼浇筑成牢固的桩位，顶面复以100×100×4mm钢板，板面上刻十字作为桩点标志，并砌筑窨井形式加以保护。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 工程标高控制&lt;/h3&gt;
&lt;p&gt;高层建筑施工，至少要设三个现场水准点，以控制和引测建筑物标高，并构成空间检测闭合体系，以便闭合校核。根据现场情况设三个水准点桩（利用平面控制桩）。实际测设时，应用精度不低于S3级水准仪。±0.000以上标高引测，主要是沿结构外墙，边柱或梯间等垂直向上传递。水准标高应由三处向上引测，以便相互校核。三处用钢尺向上引测投点后，把水准仪架设到施工层上，核测三点误差在3mm以内，再以引测点在施工层上抄测标高。拆模后，在墙壁上弹出每楼层500水平线，砌块墙砌好后，同样弹出每个楼层500或1000线。&lt;/p&gt;
&lt;h3&gt;3. 建筑竖向控制&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;方法
该工程垂直度（竖向）的控制采用激光经纬仪外控法中的延长轴线法进行，方法是将激光经纬仪安置在延长轴线的控制桩上，后视首层轴线后，抬起望远镜将轴线直接投测在施工层上或者采用内控法，在二层的平面内设置控制点位，通过激光经纬仪向上投测各层的控制点位。&lt;/li&gt;
&lt;li&gt;投测中的要点
&lt;ol&gt;
&lt;li&gt;测前要对经纬仪的轴线关系进行严格的检校，观测时要精密定平水平度盘水准管，以减少竖轴不垂直的误差。&lt;/li&gt;
&lt;li&gt;轴线的延长桩点要准确，标志要准确、明显，并妥善保护好。必须以首层轴层线位置为准，直接向施工层投测，避免逐层上投造成误差积累。&lt;/li&gt;
&lt;li&gt;取正倒镜向上投测的平均位置，以抵消经纬仪的视准轴不垂直横轴和横轴不垂直视轴的误差影响。&lt;/li&gt;
&lt;li&gt;投测主要误差必须控制在标准以内，即向上投测时的投点标志误差控制在±3mm以内，照准目标的误差控制在M照60&amp;quot;/V。D&#039;/P&amp;quot;2以内，经纬仪竖轴不垂直的影响误差控制在：M竖＝(H/P^n^)×τ/5以内。以上公式中：H为建筑物全高，D&#039;为向上投测时的斜视线长，τ为经纬仪水平度盘水准管的分划值，V为经纬仪望远镜的放大倍数，P&amp;quot;为常数。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4. 施测中应注意的问题&lt;/h3&gt;
&lt;p&gt;观测时应做到前后视线等长，测水平线时，最好是用直接调整水平仪的仪器高度，使后视时的视线正对准水平线，前视时则可直接用铅笔标出视线标高的水平线。&lt;/p&gt;
&lt;p&gt;由±0.000水平线向下或向上量高差时，所用钢尺应经过检定，测量高差时尺身应垂直和用规定的拉力，并要进行尺长和温度校正。&lt;/p&gt;
&lt;p&gt;该工程±0.000以上部分施工时，首先应对±0.000以下部分的轴线、标高进行复线校核，如有误差则进行修正，修正后再采用直角或极坐标法将控制轴线重新测出，以此为准来控制以上的轴线标高。&lt;/p&gt;
&lt;h2&gt;第2节 轴线、标高控制设备及精度&lt;/h2&gt;
&lt;p&gt;经纬仪： J2激光经纬仪一台。&lt;/p&gt;
&lt;p&gt;水准仪： DS3水准仪1台。&lt;/p&gt;
&lt;p&gt;测量控制精度&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;轴线误差：墙、梁轴线偏移控制在5mm之内。&lt;/li&gt;
&lt;li&gt;标高误差：层高误差控制在5mm以内，建筑物全高误差控制在20mm之内。&lt;/li&gt;
&lt;li&gt;墙及建筑物全高垂直误差控制在15mm之内。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第3节 装修阶段标高测量&lt;/h2&gt;
&lt;p&gt;在砌块砌体施工过程中，根据主体施工时每一层楼面引出标高，用50m钢卷尺，从各楼层测出固定标高标准控制点，立好皮数杆，按皮数杆控制线砌砖，同时作好控制门窗洞口的腰线。&lt;/p&gt;
&lt;p&gt;用水准仪找平，操作程序如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安水准仪&lt;/li&gt;
&lt;li&gt;确定楼(地)面一个固定高度的点，在楼板上应按设计要求加上楼面层设计厚度。&lt;/li&gt;
&lt;li&gt;根据已定的点，用水准确定塔尺的读数。注意塔尺底部要与点对平。&lt;/li&gt;
&lt;li&gt;塔尺的读数或标记，用水准仪测出每间屋内转角处的相对标高控制点。&lt;/li&gt;
&lt;li&gt;用墨线连接所有的做好的点位，于是本层的水平线就测量完毕。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第4节 沉降观测周期的确定&lt;/h2&gt;
&lt;p&gt;建筑物建成后会引起基础及其四周的地层产生变形，这种变形在一定范围内是正常的，但超过一定的限度，不仅会影响建筑物正常使用，严重时还会危及生命财产安全。&lt;/p&gt;
&lt;p&gt;为了建筑物的安全使用，对其进行变形观测是一项不容忽视的工作。 在实际工作中，按照《建筑变形测量规程》(JG/T88-97)，对于建筑物的有效监测，及时准确地反映出沉降规律。&lt;/p&gt;
&lt;p&gt;此项测量按Ⅱ级水准精度采用闭合法观测，每施工完一层观测一次，建筑物竣工后的观测，第一年每三个月一次。第二年半年一次，以后每年一次，直至下沉稳定为止，遇特殊情况，应增加观测次数。沉降观测由有资质的单位执行，有关资料应交设计单位备查。&lt;/p&gt;
&lt;p&gt;该工程造型较为复杂, 因此我们将成立由测量员等四人组成的测量小组，专门负责定位、轴线、标高的测设，保证建筑物的几何尺寸正确无误。&lt;/p&gt;
&lt;p&gt;施工放线前，应提前复核建筑与周边红线的距离，经市规划部门现场验线及设计单位确认后方能正式施工。&lt;/p&gt;
&lt;h1&gt;第9章 主要施工方法&lt;/h1&gt;
&lt;h2&gt;第1节 结构施工顺序&lt;/h2&gt;
&lt;h3&gt;1. 桩基工程施工顺序&lt;/h3&gt;
&lt;p&gt;场地平整→测量放线→桩位土方开挖→桩护壁→清理桩孔底→桩孔验收→桩身钢筋→桩身混凝土→桩基验收。&lt;/p&gt;
&lt;h3&gt;2. 地基与基础工程施工顺序&lt;/h3&gt;
&lt;p&gt;测量放线→土方开挖→→清理基坑→基坑处理→验槽→垫层→测量放线→承台施工→地梁施工→验收。&lt;/p&gt;
&lt;h3&gt;3. 上部结构施工顺序&lt;/h3&gt;
&lt;p&gt;定位放线→绑扎剪力墙钢筋→支墙模板→搭设脚手架→支梁板模板→浇捣墙混凝土→绑扎梁、板钢筋→浇捣梁板混凝土。&lt;/p&gt;
&lt;p&gt;基础、桩基工程按Ⅰ区、Ⅱ区区组织钢筋、模板、混凝土等几大工种流水施工，主体结构采用由下至上在两施工段平行流水施工。&lt;/p&gt;
&lt;h2&gt;第2节 桩基与地基基础&lt;/h2&gt;
&lt;h3&gt;1. 桩基工程&lt;/h3&gt;
&lt;p&gt;按图纸要求及甲方提供的红线图，依安排好的施工顺序放灰线，并同时考虑桩基工程的施工与其土方开挖、堆放的合理性，以避免二次搬运和不必要的窝工与工期浪费。&lt;/p&gt;
&lt;h4&gt;9.2.1.1 采用现浇砼分段护壁的人工挖孔桩的施工工艺流程。&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;放线定位
按设计图纸放线、定位桩。&lt;/li&gt;
&lt;li&gt;开挖土方
采取分段开挖，每段高度决定于土壁保持直立状态的能力，一般以0.8~1.0m为一施工段。在地下水以下施工应及时用吊桶将泥水吊出。如遇大量渗水，则在孔底一侧挖集水坑，用高扬程潜水泵排出孔外。&lt;/li&gt;
&lt;li&gt;测量控制
桩位轴线采用在地面设十字控制网，基准点。安装提升设备时，使吊桶的钢丝绳中心与桩孔中心线一致，以作挖土时粗略控制中心线用。&lt;/li&gt;
&lt;li&gt;支设护壁模板
模板高度取决于开挖方施工段的高度，一般为1m,由8块活动木模板组合而成。&lt;/li&gt;
&lt;li&gt;设置操作平台
在模板顶放置操作平台，平台可用角钢和钢板制成半圆形，两个合起来即为一个整圆，使用时临时放置砼拌合料和灌注护壁砼用。&lt;/li&gt;
&lt;li&gt;灌注护壁砼
护壁砼要注意捣实，因它起着护壁与防水双重作用，上下护壁间搭接50~75mm。&lt;/li&gt;
&lt;li&gt;拆除模板继续下一段的施工
当护壁砼达到一定强度后便可拆除模板，一般在常温情况下约24小时可以拆除模板，再开挖下一段土方，然后继续支模板灌注护壁砼，如此循环，直到挖到设计要求的深度。&lt;/li&gt;
&lt;li&gt;钢筋笼沉放
钢筋笼就位，对质量1000kg以内的小型钢筋笼，可用带有小卷扬机和活动的小型吊运机具，或用汽车吊吊放入孔内就位。&lt;/li&gt;
&lt;li&gt;排除孔底积水，灌注桩身砼
当灌注砼前，应先放置钢筋笼，并再次测量孔内虚土厚度，超过要求应进行清理。砼坍落度为8~10cm。砼灌注可用手推车运输向桩孔内灌注。砼上下料用串桶，深桩孔用砼导管。砼应连续分层灌注，每层灌注高度不超过1.5m。对于直径较小的挖孔桩，距地面6m以下利用砼的大坍落度（掺粉煤灰或减水剂）和下冲力使之密实；6m以内的砼应分层振捣密实。对于直径较大的挖孔桩应分层振捣密实，第一次灌注到扩底部位的顶面，随即振捣密实；再分层灌注桩身，分层捣实，直至桩顶。当砼灌注量大时，可用砼泵车和布料杆。在初凝前抹压平整，以避免出现塑性收缩裂缝或环向干缩裂缝。表面浮浆层应凿除，使之与上部承台或底板连接良好。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;9.2.1.2 施工注意事项&lt;/h4&gt;
&lt;h5&gt;9.2.1.2.1 施工安全措施&lt;/h5&gt;
&lt;p&gt;人工挖孔桩是人力挖掘成孔，必须在保证安全的条件下作业。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从事挖孔桩作业的工人以健壮男性青年为宜，并须经健康检查和井下、高空、用电、吊装及简单机械操作等安全作业培训且考核合格后，方可进入现场施工。&lt;/li&gt;
&lt;li&gt;在施工图会审和桩孔挖掘前，要认真研究钻探资料，分析地质情况，对可能出现管涌、涌水以及有害气体等情况应制定有针对性的安全防护措施。如对安全施工存在疑虑，应事前向有关单位提出。&lt;/li&gt;
&lt;li&gt;施工现场所有设备、设施、安全装置、工具、配件以及个人劳保用品等必须经常进行检查，确保完好和安全使用。&lt;/li&gt;
&lt;li&gt;为防止孔壁坍塌，应根据桩径大小和地质条件采取可靠的支护孔壁的施工办法。&lt;/li&gt;
&lt;li&gt;孔口操作平台应自成稳定体系，防止在护壁下沉时被拉跨。&lt;/li&gt;
&lt;li&gt;在孔口设水平移动式活动安全盖板，当提土桶提升到离地面约1.8m，推活动盖板关闭孔口，手推车推至盖板上卸土后，再开盖板，放下提土桶装土，以防止土块、操作人员掉入孔内伤人。采用电葫芦提升提土桶，桩孔四周应设安全栏杆。&lt;/li&gt;
&lt;li&gt;孔内必须设置应急软爬梯，供人员上下孔使用的电葫芦、吊笼等应安全可靠并配有自动卡紧保险装置，不得使用麻绳和尼龙绳吊扶或脚踏井壁凸缘上下。电葫芦宜采用按钮式开关，使用前必须检验其安全吊线力。&lt;/li&gt;
&lt;li&gt;吊运土方用的绳索、滑轮和盛土容器应完好牢固，起吊时垂直下方严禁站人。&lt;/li&gt;
&lt;li&gt;施工场地内的一切电源、电路的安装和拆除必须由持证电工操作，电器必须严格接地、接零和使用漏电保护器。各孔用电必须分闸，严禁一闸多用。孔上电缆必须架空2.0m以上，严禁拖地和埋压土中，孔内电缆电线必须有防湿、防潮、防断等保护措施。照明 应采用安全矿灯或12V以下的安全灯。&lt;/li&gt;
&lt;li&gt;护壁要高出承台垫层面200mm左右，孔周围要设置安全防护栏杆。&lt;/li&gt;
&lt;li&gt;施工人员必须戴安全帽，穿绝缘胶鞋。孔内有人时，孔上必须有人监督防护，不得擅离岗位。&lt;/li&gt;
&lt;li&gt;当桩孔开挖深度超过5m时，每天开工前应进行有毒气体的检测；挖孔时要时刻注意是否有有毒气体；特别是当孔深超过10m时要采用必要的通风措施，风量不宜少于25L/s。&lt;/li&gt;
&lt;li&gt;挖出的土方应及时运走，机动车不得在桩孔附近通行。&lt;/li&gt;
&lt;li&gt;加强对孔壁土层涌水情况的观察，发现异常情况，及时采取处理措施。&lt;/li&gt;
&lt;li&gt;灌注桩身砼时，相邻10m范围内的挖孔作业应停止，并不得在孔底留人。&lt;/li&gt;
&lt;li&gt;暂停施工的桩孔，应加盖板封闭孔口，并加0.8~1m高的围栏围蔽。&lt;/li&gt;
&lt;li&gt;现场应设专职安全检查员，在施工前和施工中应进行认真检查；发现问题及时处理，待消除隐患后再行作业；对违章作业有权制止。&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;9.2.1.2.2 挖孔注意事项&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;开挖前，应从桩中心位置向四周引出四个桩心控制点，用牢固的木桩标定。当一节桩孔挖好安装护壁模板时，必须用桩心点来校正模板位置，并应设专人严格校核中心位置及护壁厚度。&lt;/li&gt;
&lt;li&gt;修筑第一节孔圈护壁应符合下列规定：
&lt;ul&gt;
&lt;li&gt;孔圈中心线应的桩的轴线重合，其与轴线的偏差不得大于20mm。&lt;/li&gt;
&lt;li&gt;第一节孔圈护壁应比下面的护壁厚100~150mm，并应高出现场地表面200mm左右。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;修筑孔圈护壁应遵守下列规定：
&lt;ul&gt;
&lt;li&gt;护壁厚度、拉接钢筋或配筋强度等级应符合设计要求。&lt;/li&gt;
&lt;li&gt;桩孔开挖后应尽快灌注护壁砼，且必须当天一次性灌注完毕。&lt;/li&gt;
&lt;li&gt;上下护壁间的搭接长度不得少于50mm。&lt;/li&gt;
&lt;li&gt;灌注护壁砼时，可用敲击模板用竹竿木棒等反复插捣。&lt;/li&gt;
&lt;li&gt;不得在桩孔水淹没模板的情况下灌注护壁砼。&lt;/li&gt;
&lt;li&gt;护壁砼拌合料中宜掺入早强剂。&lt;/li&gt;
&lt;li&gt;护壁模板的拆除，应根据气温等情况而定，一般可在24小时后进行。&lt;/li&gt;
&lt;li&gt;发现护壁有蜂窝、漏水现象应及时加以堵塞或导流，防止孔外水通过护壁流入桩内孔内。&lt;/li&gt;
&lt;li&gt;同一水平面上的孔圈二正交直径的极差不宜大于50mm。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;多孔桩同时成孔，应采取间隔挖孔方法，以避免相互影响和防止土体滑移。&lt;/li&gt;
&lt;li&gt;对桩的垂直度和直径，应每段检查，发现偏差，随时纠正，保证位置正确。&lt;/li&gt;
&lt;li&gt;遇到流动性淤泥或流沙时，可按下列方法进行处理：
&lt;ul&gt;
&lt;li&gt;减少每节护壁的高度（可取0.3~0.5m），或采取钢护筒、预制砼沉井等作为护壁。待穿过松软层或流沙层后，可按一般方法边挖掘边灌注砼护壁，继续开挖桩孔。&lt;/li&gt;
&lt;li&gt;当采用（1）方法仍无法施工时，应迅速用砂回填桩孔到能控制坍孔为止，并会同有关单位共同处理。&lt;/li&gt;
&lt;li&gt;开挖流砂严重的桩孔时，应将附近无流砂的桩孔挖深，使其起集水井作用。集水井应选在地下水流的上方。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;遇到塌孔时，一般可在塌方处用砖砌成外模，配适当钢筋（φ6~9mm，间距150mm）再支钢内模灌注砼护壁。&lt;/li&gt;
&lt;li&gt;当挖孔至桩端持力层岩（土）面时，应及时通知建设、设计单位和质检（监）部门对孔底土进行鉴定。经鉴定符合设计要求后，才能按设计要求进行入岩挖掘或进行扩底端施工。不能简单地提供的桩长参考数据来终止挖掘。&lt;/li&gt;
&lt;li&gt;扩底时，为防止扩底部位塌方，可采用间隔挖土扩底措施，留一部分土方作为支撑，待灌注砼前挖除。&lt;/li&gt;
&lt;li&gt;终孔时，应清除护壁污泥、孔底残渣、浮土、杂物和积水，并通知建设单位、设计单位及质检（监）部门对孔底形状、尺寸、土质等进行检验。检验合格后，应迅速封底、安装钢筋笼、灌注砼。孔底地质状况应妥善保存备查。&lt;/li&gt;
&lt;li&gt;工程桩施工前必须进行桩端持力层的&amp;quot;岩基荷载试验&amp;quot;。&lt;/li&gt;
&lt;li&gt;工程桩的质量检验根据成桩的质量而定。&lt;/li&gt;
&lt;li&gt;当桩的最小中心距不满足2.5d或D+1m（当D大于2.0m时），应跳挖施工，且待第一批桩浇灌混凝土并其强度达到5.0N/mm^2^后，再挖扩相邻桩。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 地基基础&lt;/h3&gt;
&lt;h4&gt;1. 土方机械的选用&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;名称&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;规格&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;台数&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;方式&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;优点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;反铲挖掘机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;WY-60&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;沟端开行&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;挖土深度、宽度较大&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;自卸运输车&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5T&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;装、卸、运土灵活&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;2. 土方工程&lt;/h4&gt;
&lt;p&gt;拟采用一台反铲挖掘机进行开挖，自卸汽车配合运土，挖土采用两次开挖，第一次采用大面积开挖，挖至标高地梁以上20CM处，开挖方向由46轴退挖至1轴，局部承台地梁的分布不是很密集时，可考虑基坑槽的逐个开挖，第二次开挖主要内容为基础梁及承台土方，开挖方法由46轴开始，采用逐条基础梁，逐个基坑进行开挖，开挖过程中及时组织人工修理边坡，清理浮土。机械开挖的土方由自卸汽车运出场外，人工所挖土方由塔吊运出坑外。边坡支护视基础开挖的深浅程度，按照要求设置边坡并做好边坡支护。&lt;/p&gt;
&lt;h4&gt;3. 基坑降排水&lt;/h4&gt;
&lt;p&gt;沿基坑槽周边挖宽为300&lt;em&gt;500的排水沟，在四个这角处设四个集水井，集水井尺寸为500&lt;/em&gt;500&lt;em&gt;1000，排水沟采用300&lt;/em&gt;500的排水沟，其排水沟内积水可流入集水井内，通过潜入泵抽入沉淀池内，再由沉淀池抽入市内排水管网，基坑上周边2m范围内土地采用砼硬化，并设阻水坡，由基坑向外按2％泄水，以防止雨水及其它生产、生活用水流入基坑。&lt;/p&gt;
&lt;h4&gt;4. 垫层施工&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;人工清理基层土方：基础土方经机械开挖后，仅留20cm厚的余土由人工清底，人工清底的土方及时运出坑外。&lt;/li&gt;
&lt;li&gt;垫层：当桩头及土方清理完成后，即组织业主的现场代表、设计单位代表、监理工程师及地质勘察院的代表共同验槽，验槽合格后即浇筑C15砼垫层，在垫层浇筑时，尽量做到中间稍高；四周稍底，以便于基底清洁。而其中垫块制作在进入现场时即开始制作。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基础施工前建筑场地必须按有关规定进行探查处理，如果遇到异常情况或与地质勘查报告不符时，应与建设单位、设计院商定处理方案。&lt;/p&gt;
&lt;h2&gt;第3节 回填土工程&lt;/h2&gt;
&lt;p&gt;工程回填土方施工时，事先确定夯填的先后顺序、分层厚度，办理相关的隐蔽验收手续等，再进入其下一步施工。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;填土方法
&lt;ul&gt;
&lt;li&gt;用手推车送土，以人工用铁锹、耙、锄等工具进行回填。&lt;/li&gt;
&lt;li&gt;从场地最低部分开始，自下而上分层铺填，每层虚铺厚度不大于30cm。&lt;/li&gt;
&lt;li&gt;管道回填应在两侧用细土同时均匀回填、夯实，防止管道中心线位移。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;填土夯实方法
&lt;ul&gt;
&lt;li&gt;填土应尽量采用同类土填筑，并宜控制土的含水率在最优含水量范围内。&lt;/li&gt;
&lt;li&gt;填土应预留一定的下沉高度，以备在行车、堆重或干湿交替等自然因素作用下，土体逐渐沉落密实。&lt;/li&gt;
&lt;li&gt;打夯前应将填土初步整平，打夯要按一定方向进行，一夯压半夯，夯夯相接，行行相连，两遍纵横交叉，分层夯打。&lt;/li&gt;
&lt;li&gt;基坑回填应在相对两侧或四周同时进行回填夯实。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;压实排水要求
&lt;ul&gt;
&lt;li&gt;填土层如有滞水时，应在四周设置排水沟和集水井，将水排出。&lt;/li&gt;
&lt;li&gt;已填土如遭水浸，应反稀泥铲除后，方可进行下一道工序。&lt;/li&gt;
&lt;li&gt;填土区应保持一定横坡，或中间稍高两边稍低，以利排水。当天填土应在当天压实。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;回填土质量控制与检验
对有密度要求的填方，在夯实后要对每层回填土的质量进行检验。一般采用环刀法取样测定土的干密度，求出土的密实度，符合设计要求后，才能填筑土层。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第4节 结构工程施工&lt;/h2&gt;
&lt;h3&gt;1. 钢筋工程&lt;/h3&gt;
&lt;h4&gt;1. 钢筋的质量要求&lt;/h4&gt;
&lt;p&gt;本工程所使用的钢筋均为现场加工、安装，对每一种型号的钢筋进入现场后，必须有出厂合格证，经过检测单位进行拉力及冷弯试验，可焊性分析，复检合格后施工现场方可使用。钢筋表面应清洁无损伤，无污染，无铁锈，在使用前必须清除干净，钢筋应按施工顺序配套加工，每种规格的钢筋必须挂牌标注，堆放整齐。工程中使用的成品钢筋型号、直径、形状、尺寸、数量必须和施工图、料单相符。钢筋按施工图放样并制作后，分规格、型号、部位码放，并书写标志牌。&lt;/p&gt;
&lt;h4&gt;2. 加工设备的选择&lt;/h4&gt;
&lt;p&gt;钢筋加工集中设在现场进行制作、绑扎。配备一台钢筋调直机、两台钢筋切断机、两台弯曲机、一台对焊机、三台电弧焊机。&lt;/p&gt;
&lt;h4&gt;3. 钢筋的绑扎和安装&lt;/h4&gt;
&lt;p&gt;钢筋绑扎顺序：&lt;/p&gt;
&lt;p&gt;剪力墙：前道工序验收→钢筋接长焊接或挷接→箍筋验收。&lt;/p&gt;
&lt;p&gt;梁板：梁、板模板验收→轴线、标高复核→梁、板钢筋绑扎→预留预埋→验收。&lt;/p&gt;
&lt;p&gt;钢筋绑扎时，根据现场情况在模板上用磁笔标出箍筋或分布筋位置，并以此作为绑扎依据。如当模板未支好前绑箍筋时，可在焊接好的主筋上，用钢尺按图纸要求分好箍筋绑扎点，并用记号笔标出位置，而后即可进行绑扎。钢筋的绑扎、焊接及加工形状，必须符合设计及规范要求。&lt;/p&gt;
&lt;p&gt;钢筋搭接长度按设计要求加工、安装，钢筋绑扎要严格控制位置，柱子钢筋上口应设置锁口箍筋，点焊牢固且保证轴线位置正确。各种负弯矩筋，应用隔点焊接牢固，防止倾倒。&lt;/p&gt;
&lt;p&gt;双层钢筋上下要保证用&amp;quot;几&amp;quot;型钢筋支撑，梁、板、墙钢筋匀应垫块，以保证保护层厚度符合设计要求。现浇悬挑构件，上部钢筋严禁踩踏，要设置钢筋凳支稳，以免浇灌混凝土时踩踏，剪力墙钢筋采用电渣焊施工，在施工中必须确保柱的主筋同心，并且焊接符合质量要求。其支撑垫块应该事先制作，标号必须与所浇构件相同或者略高（高于此构件一个等级）。&lt;/p&gt;
&lt;p&gt;钢筋绑扎后，应仔细核对图纸，重点检查钢筋规格、数量、锚固长度、焊接等部位，做好自检自查记录及检查记录。&lt;/p&gt;
&lt;h4&gt;4. 钢筋工程中应注意的问题&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;所有钢筋在进场前，均应提供出厂合格证或检验报告。进场后，应在监理的监督下按施工规范进行见证取样、送检，并按公司质量体系文件要求作好状态标识，严禁不合格或劣质钢材用于工程中。&lt;/li&gt;
&lt;li&gt;钢筋绑扎时，其节头位置根数应严格遵循设计图纸及施工规范要求，工长在配筋时，除自检外，还应画出通长梁筋示意图，图上应注明尺寸、型号、根数、节头位置，以便操作人员一目了然。&lt;/li&gt;
&lt;li&gt;钢筋垫块应用高标号水泥提前制作，梁筋垫块在梁落入梁模时，应提前布置好，将梁正确落在垫块上，尽量避免因漏垫而产生用钢管撬起梁重垫现象的发生，对于柱筋上垫块，应预留扎丝，待柱成型时，每边三排按上中下位置，并绑扎牢固，不位移摇晃。&lt;/li&gt;
&lt;li&gt;对于接头钢筋应严格保持其节头处钢筋尺寸的准确性，以保证钢筋接头按规范进行正常连接。&lt;/li&gt;
&lt;li&gt;梁板钢筋绑扎完毕后，为确保柱钢筋轴线的准确性，应对其通过放线进行检查复核，并予以点焊固定，确保柱筋无位移现象发生。对于复杂或绑扎顺序要求高部位，工长均应作出技术交底，经项目技术负责人审核同意后方可进行施工，不得盲目施工，造成误工处理而延误工期。&lt;/li&gt;
&lt;li&gt;施工过程中，若放线时发现钢筋有偏移现象，应立即通知技术负责人并同监理方共同研究协商处理，任何人不得盲目作出私自处理，一旦发现必将严肃处理。&lt;/li&gt;
&lt;li&gt;施工中，质检员、工长要跟班检查，重点注意钢筋的品种、数量、搭接位置，锚固长度，发现问题及时处理，做到验收一次通过。&lt;/li&gt;
&lt;li&gt;质检员和工长要及时认真做好隐蔽验收记录，与监理一起搞好钢筋工程的隐检记录。&lt;/li&gt;
&lt;li&gt;在施工过程中，局部若需钢筋代换时，钢筋工长应事先通知项目技术负责人，并取得设计院同意后方可进行。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;5. 钢筋直螺纹接头&lt;/h4&gt;
&lt;p&gt;钢筋直径d≥18者采用A级直螺纹套筒接头。钢筋直径在14---18之间者采用闪光对焊，现场接头采用双面搭接焊5d。下面对直螺纹的施工阐述如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;钢筋下料：钢筋下料可用钢筋切断机和砂轮锯，但不允许用气割下料，要求钢筋端面垂直于钢筋轴线，端头不准挠曲，不准成蹄形。&lt;/li&gt;
&lt;li&gt;钢筋套丝：钢筋套丝要预先在钢筋套丝机上加工，为了确保套丝质量，施工人员必须持证上岗作业，对加工的直螺纹丝头，要求操作人员用牙型逐个检查，然后由质检员按1%抽查，并做好检查记录，检查合格的丝夹，立即将其一端拧上相同规格的塑料保护帽，另一端按规定人力矩值，用专用扭力扳手，把与钢筋规格相同的连接套拧紧，存放待用。&lt;/li&gt;
&lt;li&gt;做钢筋连接试件静力拉伸试验：钢筋连接前，按每种规格钢筋接头的3%做钢筋接头试件，送检测中心做静力拉伸试验，并出具试验报告，当钢筋接头试件达到要求时，方可进行钢筋连接施工。&lt;/li&gt;
&lt;li&gt;钢筋连接：连接钢筋以前先回收结构钢筋连接端和塑料密封盖，并检查钢筋规格是否和连接套规格一致，锥螺蚊丝扣是否完好无损，发现杂物要用铁刷清除干净，然后把装好连接套的一端钢筋拧到被连接钢筋上，再用专用扭力扳手，按规定从扭拧紧钢筋接头，当扳手发出响声时，钢筋便连接好，随后立即用油漆作好标记，以便质检人员抽检并作抽检记录。&lt;/li&gt;
&lt;li&gt;检查钢筋连接接头连接质量：在支模前，质检员用质检的力矩扳手，按规定的抽检接头数量和扭力值进行检查，要求钢筋连接质量100%合格，如有一根钢管筋的连接质量达不到规定的扭力值，则要将该构件全部接头重新扭到规定值，并且钢筋接头的丝扣外露部分不得超过一个完整丝扣。抽检数量按每道梁或柱抽一个接头；板墙、基础底板，每100个接头为一批，不足100个也做一批，每批抽检三个接头，要求钢筋的连接质量100%，否则，必须查明原因，重新连接或采用贴角焊缝补强。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;6. 电渣压力焊&lt;/h4&gt;
&lt;p&gt;电渣压力焊是利用电流通过渣池产生的电阻热将钢筋端部溶化然后施工压力使钢筋焊合的一种连接方式。&lt;/p&gt;
&lt;p&gt;其操作工艺如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;施工准备
a 焊接设备：主要包括：焊接电源、焊接机头、控制箱、焊剂填装金属盒等。
b 焊接电源：竖向钢筋电渣压力焊的电源，可采用一般的BX3－500型与BX2－1000型交流弧焊机，也可采用JSD－600型专用电源。
c 焊接机头：应满足小巧轻便、监控手段齐全、对中迅速准确等要求。
d 焊剂盒与焊剂：焊剂盒内径为80-100mm，与所焊钢筋的直径相适应，焊剂宜采用431型。
e 操作工人的培训：施工前由主管技术部门组织操作人员进行技术培训，经考试合格后方准上岗。
f 材料准备：钢筋工长应根据楼层标高及设计节头位置要求，提前对钢筋下料，按型号、数量运至施工区。&lt;/li&gt;
&lt;li&gt;工艺要点
整个电焊工艺的流程为：引弧→电弧→电渣→顶压
a 引弧：分为直接引弧法和铁丝球引弧法。
b 电弧过程：靠电弧的高温作用，将钢筋端头的凸出部分不断烧化，同时将接口周围的焊剂充分熔化，形成一定深度的渣池。
c 电渣过程：渣池形成一定深度后，将上钢筋缓缓插入渣池中，此时电弧熄灭，进入电渣过程。
d 挤压过程：在停止代电的瞬间，对钢筋施力挤压力，把焊口部分熔化的金属、熔渣及氧化物等杂质全部挤出结合面。&lt;/li&gt;
&lt;li&gt;质量检验
a 取样数量：每300个同类型接头作为一批。
b 外观检查：接头焊包应饱满和比较均匀；轴线偏移不得超过钢筋直径的0.1倍且不大于2mm；弯折不得大于4度。&lt;/li&gt;
&lt;li&gt;拉伸试验：三个试样均不得低于该级别钢筋的抗拉强度标准值。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;施工中应注意对节点处钢筋校正固定，确保一次柱砼成型后，柱筋无偏移现象。&lt;/p&gt;
&lt;p&gt;施工前要组织相关专业人员对图纸进行学习。钢筋下料单由专业工长下料、复查，对照图纸，挂牌下料，为保证钢筋无误，项目部采用钢筋下料单进行构件编号，分别对钢筋的规格、种类、数量、长度、施工要点作出明确交底。&lt;/p&gt;
&lt;h3&gt;2. 模板工程&lt;/h3&gt;
&lt;h4&gt;1. 模板体系&lt;/h4&gt;
&lt;p&gt;柱采用15厚木胶合板模板，木肋50×100mm，间距400--500mm，梁底模用40mm 厚木模板，梁测模、板底模板均用木胶合板模板，钢管支撑。&lt;/p&gt;
&lt;p&gt;模板施工中，悬挑梁跨度大于2.0m时，施工按1/300起拱；一般梁跨度大于4m均按1/500起拱，拆除模板前，砼试块试验强度应达到100%，但为了加快模板周转，本工程采用模板的快拆体系。&lt;/p&gt;
&lt;h4&gt;2. 施工工序&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;墙模的拼装流程
选择15mm厚的夹板，同时辅以50*100mm^2^的木枋拼装成墙模，墙模的支撑系统以Φ48钢管支设而成。其施工流程如下：
施工准备（模板的优化组合配置）→模板的选择→柱模的支撑系统的搭设→模板拼装→模板加固、较核→浇砼→拆模→清理→再周转使用。&lt;/li&gt;
&lt;li&gt;模板的支撑系统
施工前按照构件的截面尺寸，用15夹板、木枋下料制作定型模板，每一墙模板按柱位置注明编号，分类、分区依次码放备用。为防止砼浇捣时因砼自重机械振捣产生胀模，对于边长小于600的考虑用木枋并按200-250的间距进行加固支撑，大于600的边长还要采用ф12对拉丝杆、@600双向加以固定。固定前柱子四角用线锤将其垂直度的误差控制在5mm以内，并校验截面尺寸。然后用卡子、木枋、短钢管固定牢固。&lt;/li&gt;
&lt;li&gt;梁、板模板的施工顺序
具体施工顺序为：梁底模→板模→梁侧模→梁板拼缝处理。
对大于700以上的梁在梁的中部加一根对拉螺栓。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;3. 准备工作&lt;/h4&gt;
&lt;p&gt;由木工工长按设计要求，对各部位分类制定配模及支撑方案，按照方案确定几何形状、尺寸、规格、数量、间距，不得任意加大，防止产生结构变形。并提前提供《材料需用量计划表》按施工进度要求确定模板、材料进场时间，尽量减少堆放场地。以至有效的提高资金的利用率。&lt;/p&gt;
&lt;h4&gt;4. 模板工程的施工质量&lt;/h4&gt;
&lt;p&gt;模板工程的施工质量，必须做好拼缝严密不漏浆，支撑稳固安全不变形，标高和构件断面尺寸严格按图施工，按规定验收。对梁板节点的模板提前配置好，方便拆除安装，保证外观质量和断面尺寸。&lt;/p&gt;
&lt;h4&gt;5. 模板质量要求&lt;/h4&gt;
&lt;p&gt;模板的搭设必须准确掌握构件的几何尺寸，保证轴线位置的准确。&lt;/p&gt;
&lt;p&gt;模板应具有足够的强度、刚度及稳定性，能可靠地承受新浇砼的重量、侧压力以及施工荷载。浇筑前应检查承重架及加固支撑扣件是否拧紧。&lt;/p&gt;
&lt;p&gt;模板的安装误差应严格控制在允许范围内，超过允许值必须校正。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;项目&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;允许偏差&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;轴线位置&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;板表面标高&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;±5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;柱、梁&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;+4、-5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;层高垂直度&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;全高≤5m&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;全高〉5m&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;相邻板面高低差&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;表面平整（2m长度以上）&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;6. 模板支设的质量控制措施&lt;/h4&gt;
&lt;p&gt;所有结构支模前均应由专人进行配板设计和画出配板放样图并编号，余留量由缝模调整。&lt;/p&gt;
&lt;p&gt;模板及其支撑均应落在实处，不得有&amp;quot;虚&amp;quot;脚出现，安拆均设专人负责。&lt;/p&gt;
&lt;p&gt;墙柱脚模板应加垫木和导模，防止砼浆流失造成栏根。&lt;/p&gt;
&lt;p&gt;为防止混凝土在硬化过程中与模板粘结，影响脱模，在浇筑混凝土之前，应在清理过的模板表面上（包括第一次使用的模板）涂刷隔离剂。&lt;/p&gt;
&lt;p&gt;安装模板时需有保护措施：模板由塔吊吊装就位时，因钢筋绑扎好，钢筋很容易损伤面板，这时需有施工工人在现场扶住模板，轻轻就位，避免损伤模板。&lt;/p&gt;
&lt;p&gt;在靠近模板电焊钢筋、钢管时，在施工焊处的模板面应用铁皮垫隔，防止焊火烧坏模板板面。&lt;/p&gt;
&lt;p&gt;在安装模板之前，应将各种电管、水管等按图就位，避免模板安装好后二次开洞，模板自身就位时也应严格按照配模图纸进行安装。&lt;/p&gt;
&lt;p&gt;浇捣振捣混凝土时震动器不能直接碰到板面上，避免磨损撞坏面板，同时振捣时间要按规范规定，要适时，以防模板变形。&lt;/p&gt;
&lt;h4&gt;7. 模板的拆除&lt;/h4&gt;
&lt;p&gt;拆除支撑及模板前，必须请示有关各方签证认可后，方可拆除模板，实行摸板拆除许可制度，经项目技术负责人依照GB50204-02的有关要求和现场实际情况决定拆除部位和范围。模板拆除时不得对混凝土表面造成损伤；梁板模板拆除前，必须在试压报告出来，满足施工规范的要求，方可拆除模板。模板拆除应满足如下规定：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不承重模板，在砼强度能保证其表面不被拉毛及棱角完整后方可拆除。&lt;/li&gt;
&lt;li&gt;已经拆除的模板及支架结构，应在混凝土强度达到设计要求后，方允许承受全部荷载。施工中不得超载使用，严禁堆入过量的建筑材料。当承受施工荷载大于其承载能力时，经过核算，采取相应措施。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;模板拆除后，应该作到工完场清。&lt;/p&gt;
&lt;p&gt;拆除模时间：侧模板以不损坏砼表面及楞角时，方可拆模，底模拆除时间详下表所示：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;结构类型&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;结构跨度（m）&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;按设计的砼强度标准值百分率（%）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;板&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;≤2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&amp;gt;2，≤8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&amp;gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;梁&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;≤8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&amp;gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;悬臂构件&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&amp;gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;8. 模板施工的注意事项&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;所进场的模板及枋材，严禁乱裁，对同型尺寸大小的模板，应分类归堆，方便周转利用，减少模板损耗。&lt;/li&gt;
&lt;li&gt;成型模板补缝时可直接利用双面泡沫胶进行对节，必要时外面用胶带贴牢，以密实缝隙。&lt;/li&gt;
&lt;li&gt;为保证模板的质量，需对变形木枋和翻皮、缺棱少角的模板，在加工车间修理后方可投入使用。&lt;/li&gt;
&lt;li&gt;在施工过程中，如发现局部模板塌陷或跑模必须立即停止该处的混凝土的施工，报现场技术负责人研究处理方案，提出措施，并要求快速处理完毕，保证混凝土的连续浇捣。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 钢筋砼工程&lt;/h3&gt;
&lt;h4&gt;1. 泵送砼劳动力配备&lt;/h4&gt;
&lt;p&gt;本工程送砼劳动力配备情况详下表格：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;工种&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;人数&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;工 作 内 容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;总负责人&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;全面负责砼施工工作，处理有关问题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;指挥人员&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;负责组织指挥供料、泵送、布料浇筑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;值班电工&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;全面负责楼照明及电器照明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;机修工&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;负责机修（如振动棒等）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;泵车操作人员&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;泵车操及保养&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;泵车辅助人员&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;泵车料斗倒料、清除石、杂物及回料等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;架子工&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;布管、拆管、布料及清洗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;砼工&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;40&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;振捣、找平&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;2. 砼的泵送&lt;/h4&gt;
&lt;p&gt;泵送前，应先开机用水润湿整个管理，然后送入水泥浆，使输送管壁处于充分滑润状态。泵送开始时，注意观察砼的液压表和各部位工作状态泵送应连续进行，当发生供庆脱节不能连续泵送时，泵机不能停止工作，应每隔4-5min使泵正、反转两个冲程，把料从管道内抽回重新拌合，再泵入管道，以免管道内拌合料结块或沉淀，同时开动料斗中的搅拌器，搅拌3-4转，防止砼离析。当泵送停歇超过45min或砼离析时，应立即用压力排除管道内的砼，经清洗干净后重新泵送。&lt;/p&gt;
&lt;p&gt;在泵送砼时，应使料斗内持续保持一定量的砼(20cm厚以上），以免吸入空气，使转换开关阀间造成砼逆流形成堵塞。&lt;/p&gt;
&lt;p&gt;在泵送时，每2h换一次水洗槽，并检查泵缸的行程，发现有变化及时调整，泵送时，应随时观察泵送效果，若喷出砼象一根柔软的柱子，直径微微放粗，石子不露出，更不散开，说明达效果很好，若出一半就散开，说明和易性不好，喷到地面时砂浆飞溅严重，说明坍落度应再小些。&lt;/p&gt;
&lt;p&gt;泵送结束后，要及时进行管道清洗，清洗可采用水洗或气洗，也就是分别用压力水或压缩空气推送海绵球或塑料球进行。&lt;/p&gt;
&lt;h4&gt;3. 砼试块留置&lt;/h4&gt;
&lt;p&gt;本工程砼采用的是商品砼，故砼的试块必须采取两次随机抽样制作，第一次在砼搅拌站，第二次在施工现场，留置组数按下面执行。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每拌制100盘且不超过100m^3^的同配合比的砼,其取样不得少于一次。&lt;/li&gt;
&lt;li&gt;每工作班拌制的 同配合比的砼不足100盘时,其取样不得少于一次。&lt;/li&gt;
&lt;li&gt;每一现浇楼层段同配合比的砼,其取样不得少于一次。&lt;/li&gt;
&lt;li&gt;每次取样留置标准试件的同时，同条件养护试件的留置组数根据实际需要确定。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上每次取样至少留置一组标准试件，每组三个试件应在同盘砼中取样制作。&lt;/p&gt;
&lt;h4&gt;4. 砼养护&lt;/h4&gt;
&lt;p&gt;本工程砼强度较高，在整个砼的施工过程中应加强砼的养护措施，防止砼产生温差裂缝或收缩裂缝。&lt;/p&gt;
&lt;p&gt;施工时可按常规养护，采用湿水养护，夏季高温，则采用草包复盖湿水养护，养护时间14天，雨期应注意及时遮盖，保护好新浇砼，砼浇筑后，当其强度达到1.2Mpa以上时，才能进行下道工序。砼养护由专人负责。&lt;/p&gt;
&lt;h4&gt;5. 质量要求&lt;/h4&gt;
&lt;p&gt;凡进入现场的原材料，水泥应检查出厂证明书，并按规定进行安定性和强度试验，贮藏期三个月以上的水泥重新核定其标号，砂石材料应符合相应的规范要求，进场时重新试验鉴定，做含泥量和压碎试验。&lt;/p&gt;
&lt;h4&gt;6. 注意事项&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;混凝土在浇筑前，要严格执行混凝土浇捣许可证制度，严格控制混凝土的标号，由专人负责监督检查，发现问题及时纠正。&lt;/li&gt;
&lt;li&gt;梁、板采用插入式震动棒震捣，混凝土浇筑的自由下落高度不得超过3.0米，结构超高时应设斜槽下料； 板表面采用平板振动器震捣。混凝土厚度为1.25倍震动棒长度分层进行，梁板同时浇筑，垂直构件连续浇筑，并避免触及模板跑位，震捣中不得漏震、欠震、少震、超震。&lt;/li&gt;
&lt;li&gt;混凝土浇筑成型后，现场应根据其气候情况进行洒水养护，防止混凝土出现裂缝。&lt;/li&gt;
&lt;li&gt;现浇楼梯施工
现浇楼梯在模板施工前，要由专人负责放大样，根据所放大样再进行模板设计，由于本工程采用了现浇楼梯，所以在楼梯模板施工中，要以楼梯板为主，定出楼梯的主轴线和水平标高。楼梯模板仍采用以木模板为主，钢管脚手架及木顶撑作支架体系。楼梯板的施工缝，定在梯板梁的1/3处，钢筋不作截断处理。&lt;/li&gt;
&lt;li&gt;基础承台地梁的混凝土浇筑方式
基础地梁、承台的混凝土方量较大，同时保证其连续施工，不留施工缝，浇筑时将投入一台砼输送泵，按照各构件短边斜向分层浇筑，再逐步向长边推进的浇筑方式布设泵管。施工时砼流淌线较长，为保证砼充分振捣密实，在一条振捣线上，可设几人同时振捣。&lt;/li&gt;
&lt;li&gt;砼的泌水控制
由于基础地梁施工时，面积较大且采用泵送砼，水灰比大，这样在浇筑过程中砼成型表面有大量积水，对于泌水控制，结合垫层施工时留下的排水坡及排水沟进行引导。具体措施如下：
&lt;ul&gt;
&lt;li&gt;对于表面砼成型时的泌水，砼收浆整平时应将泌水用刮杆赶向施工处，顺着砼流淌坡度流向基坑底面，通过垫层上留设的坡度或排水沟排至坑外。&lt;/li&gt;
&lt;li&gt;对于整个砼表面在初凝成型时，局部泌水或积水，可用铁板或小勺利用小桶直接盛装，排至坑外。&lt;/li&gt;
&lt;li&gt;砼表面应整平搓毛。具体施工时，可用水准仪在四周模板上打上标记，采用尺量控制。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;砼施工中应注意其它问题
&lt;ol&gt;
&lt;li&gt;首先，在施工前对所使用的原材料进行试验，并根据原材料进行砼试配，以确定砼配合比；在砼搅拌时，设专人监督检查，把好原材料质量关，并严格按砼配合比上料，确保砼强度符合设计要求。&lt;/li&gt;
&lt;li&gt;根据施工现场一次性砼浇筑量及砼输送泵台数，合理调配砼搅拌车，保证搅拌站砼能满足施工现场浇灌的进度要求。&lt;/li&gt;
&lt;li&gt;为防止砼堵塞输送泵管，在砼输送前，应先用同配合比一致的水泥砂浆润滑管道。&lt;/li&gt;
&lt;li&gt;砼工在拆除管道时，管内砼严禁乱倒形成局部冷缝，应搬至振捣处进行处理，同时搬移管道或其它机具时，应在固定的夹板通道上行走，禁止成挪乱扔撞击钢筋，以免发生钢筋松绑或位移等不良现象的发生。&lt;/li&gt;
&lt;li&gt;在浇筑砼时，如遇大雨，应及时对未凝固的砼采取覆盖遮雨措施，防止砼水泥砂浆的流失，对未成型的砼应振捣密实。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;7. 后浇带处理&lt;/h4&gt;
&lt;p&gt;后浇带留置时，为保证基础梁筋连续，在后浇带拦板模板上按钢筋间距，留出钢筋孔位，进行施工时，为减少后浇带清理工作量，应对后浇带进行遮挡覆盖，待混凝土达到规定的龄期后，应清除后浇浮渣，浇捣比其砼强度高一级砼。&lt;/p&gt;
&lt;p&gt;对于钢筋特别密集的梁，应及时与砼搅拌站联系，调整粗骨料粒径，并在绑扎钢筋时，有意识调整主筋间距，留出下料间隙，砼振捣时，采用小直径振捣棒以保证其砼密实。梁板砼强度等级一般不一致，故主体结构各层砼均分两步施工，即先浇筑剪力墙砼，然后浇筑梁板砼。其浇捣方法原则上同地下室柱墙及梁板砼施工。&lt;/p&gt;
&lt;p&gt;由于各层墙砼比该层顶板强度一般高一级，浇筑大面积梁板砼采用砼输送泵输送，为保证柱头砼的强度符合设计要求，当砼浇筑至距梁柱接头处&amp;gt;1m时，改用塔吊配合吊运强度较高的砼，并将该部位振捣密实。待柱头砼浇灌完后，再将柱头周边砼浇筑完，接头处充分振实，施工时必须密切配合，不能留置施工缝。&lt;/p&gt;
&lt;p&gt;结构工程的施工按区域组织均衡平行流水施工，并按先一区，后二区的顺序进行施工。&lt;/p&gt;
&lt;h2&gt;第5节 砖砌体工程&lt;/h2&gt;
&lt;h3&gt;1. 主要材料&lt;/h3&gt;
&lt;p&gt;加气混凝土砌块外墙厚度250mm、分户墙楼（电）梯间墙为200mm、其余内墙为150mm，干容重不大于5.0KN/m^3^,M5混合专用砂浆砌筑。&lt;/p&gt;
&lt;p&gt;±0.000m以下墙体采用蒸压粉煤灰砖，外墙厚250，内墙为200，用水泥砂浆砌筑。&lt;/p&gt;
&lt;p&gt;填充墙与板、梁、剪力墙间设有拉结筋，砌块按600mm间距设有拉结筋或按规范要求和现场实际情况设置拉结筋，并采用后设拉结筋办法。办法有两种：一是施工前，先将柱墙上箍筋剔出，焊上墙拉筋；二是才用植筋的方式。砌筑前要试摆，采用全顺砌筑方式，不够整砖时，用小型砌块补砌，砌块近楼地面浇捣100mm高的砼，顶面与梁下口用斜砌挤紧。&lt;/p&gt;
&lt;h3&gt;2. 砌筑工序&lt;/h3&gt;
&lt;p&gt;砖墙砌筑的一般顺序是抄平→放线→摆砖→立皮数杆→盘角→挂线→砌筑→勾缝→清理。&lt;/p&gt;
&lt;h3&gt;3. 填充墙的砌筑&lt;/h3&gt;
&lt;p&gt;对砌块填充墙，施工采用&amp;quot;三一&amp;quot;法砌筑，不准做铺刀灰，灰缝每皮砖不大于12mm，控制厚度为10mm，每天砌筑高度不大于1.40m，与柱子拉结筋拉结处填水泥砂浆，当砌到梁底约200mm，应停留五天，再用斜砖将梁下口顶紧、压实。在门窗洞口的四周，要预留好门窗洞口的安装预制块；窗下墙部分，则加做一道60mm厚细石砼窗台压顶。砌块施工前要做好湿水处理。墙砌筑时搭设内脚手架。&lt;/p&gt;
&lt;h3&gt;4. 砌筑的质量要求&lt;/h3&gt;
&lt;p&gt;在施工过程中，选择有丰富施工经验的人员，保证砌体具有良好的整体性、稳定性、受力性能。施工把好原材料关、工艺水平关。质量达到：灰缝横平坚直、砂浆饱满、薄厚均匀。砌块上下错缝、内外搭接。接搓牢固。同时按抗震要求设置好锚拉筋，严禁漏设。&lt;/p&gt;
&lt;h3&gt;5. 施工方法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;施工准备
a. 待结构验收后方可进行砌体的施工。
b. 砌块按设计要求的型号、规格、容重进场。
c. 检查构造柱或柱拉结筋数量、位置是否符合设计要求，否则应采取技术措施，使之与设计及施工规范要求相符。
d. 用墨线弹出墙体的位置线及门窗洞口边线。&lt;/li&gt;
&lt;li&gt;施工组织
主体结构验收后（中间结构验收后）立即组织砌块批量进场，由下至上砌筑。&lt;/li&gt;
&lt;li&gt;砌块施工
a. 按砼块每层高度制作皮数杆，并竖直于墙体的两侧，两相对皮数杆之间拉准线，用以控制墙体的水平度及水平灰缝厚度。
b. 砌块砌筑前应浇水湿润，将砌块的砌筑楼面清扫干净，剔除浮浆结块，向砌筑面适量浇水。
c. 尽量按设计要求购进各种规格的砌块。
d. 当填充墙长超过4.5米时，应在墙中加设与墙体有拉结筋的构造柱；当填充墙高超过设计或规范规定的高度时，应在适当部位设置与框架柱或墙体连接的圈梁。
e. 墙体接近上层梁或板底时，宜用砖斜砌挤梁，砖的倾斜度为60度左右。砌块必须灰浆饱满，以免外墙与框架梁板连接的底部渗漏。
f. 墙体洞口上不得留脚手眼，不得用斧头或瓦刀任意砍劈。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第6节 脚手架工程&lt;/h2&gt;
&lt;h3&gt;1. 钢管脚手架的搭设&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;用扣件、钢管搭设的脚手架，是施工临时结构，它要承受施工过程中的各种垂直和水平荷载。因此，必须有足够的承载能力、刚度和稳定性。&lt;/li&gt;
&lt;li&gt;在大横杆与立杆的交点处，必须设置小横杆并与大横杆卡牢。整个架子要设备必要的支撑点与连墙点，以保证脚手架成为一个稳固的结构。&lt;/li&gt;
&lt;li&gt;外脚手架的搭设：沿建筑物周围连续封闭，如因条件限制不能封闭时，应设置必要的横向支撑，端部设置连墙点。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 脚手架支撑的设置&lt;/h3&gt;
&lt;p&gt;脚手架纵向支撑在脚手架的外侧，沿高度方向由下而上连续设置。纵向支撑宽度宜为3─5个立杆纵距，斜杆与地面角度为45度范围。纵向支撑应用旋转扣件与立杆和横向水平杆扣牢，连接点与脚手架节点不大于200mm；纵向钢筋支撑的接长，宜采用对接扣件对接连接，当采用搭接时，搭接长度不小于400mm， 并用两只十字扣件扣牢。为便于施工操作层处的横向支撑可临时拆除，待施工转入另一施工层再设置。脚手架的横向支撑不宜随意拆除。&lt;/p&gt;
&lt;h3&gt;3. 钢管脚手架的拆除&lt;/h3&gt;
&lt;p&gt;拆除脚手架必须有拆除方案，并认真对操作人员进行安全技术交底，拆除时应设置警戒区，设立明显标志，并有专人警戒。拆除顺序：自上而下进行，不能上下同时作业。连墙点必须与脚手架同时拆除，不允许分段分立面拆除。拆下的扣件和配件应及时运至地面，严禁高空抛投。&lt;/p&gt;
&lt;h3&gt;4. 脚手架的安全设施&lt;/h3&gt;
&lt;p&gt;垂直设施安全网于脚手架的外侧，一般用密目安全网，四周满挂围护，安全网封闭严密，与脚手架固定牢固。&lt;/p&gt;
&lt;p&gt;其它详细情况，在施工时作出详细的专项施工组织设计。&lt;/p&gt;
&lt;p&gt;本工程全部采用钢管扣件式脚手架，外维护用脚手架为双排。钢管脚手架采用Φ4.8×3.5钢管，并保持一定独立性，主体施工完毕，即可为装修用外脚手架，脚手架设计图在工程施工时提供，施工由专业架子工进行。脚手架采用全封闭的方式。所有外立面必须采用全封闭的施工方式，即用密目安全网进行全封闭。上料口或者人行通道两铡要搭设过道防护棚。内脚手架可采用常规方法，亦采用钢管搭设。&lt;/p&gt;
&lt;p&gt;脚手架的搭设必须符合GB59-99等相关规范、技术标准的要求，保证作业人员的安全。脚手架搭设完后，必须组织有关部门和人员进行检查验收，合格后方可使用。项目实施时编制详细的有关此项的专项安全施工组织设计。&lt;/p&gt;
&lt;h2&gt;第7节 建筑防水&lt;/h2&gt;
&lt;h3&gt;1. 防水工程内容&lt;/h3&gt;
&lt;p&gt;墙体防潮层设在室内一层的墙体标高-0.060m处，用20厚1：2水泥砂浆掺5％防水剂。屋面的上人屋面为刚性防水和高聚物改性沥青卷材防水屋面；不上人屋面为高聚物改性沥青卷材防水屋面。&lt;/p&gt;
&lt;p&gt;厨、卫基层防水、屋面防水在主体结构完成后，即可组织人员清理基层，进行防水施工。厨、卫基层防水在室内抹灰完成后，所有水、暖管道就位后，即组织基层防水施工。&lt;/p&gt;
&lt;h3&gt;2. 质量控制要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;对所有进场原材料实施双控，以确保原材料合格。&lt;/li&gt;
&lt;li&gt;对防水基层认真清理干净，确保基层干燥，对防水层转角部位应处理成圆弧，所有出墙面、屋面管道应作好流水处理。&lt;/li&gt;
&lt;li&gt;对已做好的防水层应加强保护，不得损坏，防止种种上重物对防水层的冲撞损坏。&lt;/li&gt;
&lt;li&gt;防水层完工之后，面层施工之前，应按本公司程序文件要求，严格做好试水试验，并派专人记录，如有渗漏，及时修补。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 主要建筑防水施工方法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;防水涂料施工
&lt;ol&gt;
&lt;li&gt;基层处理及要求
&lt;ul&gt;
&lt;li&gt;基层应平整，要求无死弯、无尖锐棱角，凹凸处需事先进行处理。&lt;/li&gt;
&lt;li&gt;基层上的灰尘、油污、碎屑等杂物应清除干净。&lt;/li&gt;
&lt;li&gt;空鼓处应先铲除，再与有孔洞处一起采用水泥砂浆填补找平，并要达到一定强度。&lt;/li&gt;
&lt;li&gt;阴阳角应做成圆角。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;施工顺序及要求
&lt;ul&gt;
&lt;li&gt;采用涂刷法，涂刷时用长板刷、排笔等等软毛刷进行。&lt;/li&gt;
&lt;li&gt;涂刷的方向和行程长短应一致，要依次上、下、左、右均匀涂刷，不得漏刷。&lt;/li&gt;
&lt;li&gt;首先在处理好的基层上均匀地涂刷防水涂料，待其渗透到基层并固化干燥后再涂刷第二道。&lt;/li&gt;
&lt;li&gt;每道涂料均应在前一道涂料干燥后再施工。&lt;/li&gt;
&lt;li&gt;当涂料表面干固时，再抹水泥砂浆保护层。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4. 屋面施工做法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;上人屋面的做法
a. 钢筋混凝土屋面板，表面清扫干净；
b. 20厚（最薄处）1:8水泥珍珠岩找2%坡；
c. 20厚1：2.5水泥砂浆找平层；
d. 刷基层处理剂一遍；
e. 4厚APP改性沥青防水卷材；
f. 25厚挤塑型聚苯乙烯保温隔热板；
g. 点粘一层350号石油沥青油毡；
h. 40厚C30UEA补偿收缩混凝土防水层，表面压光，混凝土内配ф4钢筋双向中距150；
I. 25厚1：4干硬性水泥砂浆，面上撒素水泥；
J. 8-10厚地砖铺平拍实，缝宽5-8，1：1水泥砂浆填缝。&lt;/li&gt;
&lt;li&gt;不上人屋面做法
a. 钢筋混凝土屋面板，表面清扫干净；
b. 20厚（最薄处）1:8水泥珍珠岩找2%坡；
c. 20厚1：2.5水泥砂浆找平层；
d. 刷基层处理剂一遍；
e. 二层3厚APP改性沥青防水卷材；
f. 30厚聚苯乙烯泡沫塑料板，XY409地板胶粘剂点粘保温层；
g. 无纺布一层；
h. 50-100厚粒径10-20卵石保护层。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;屋面防水设计采用了防水卷材，施工中要突出注意屋面节点处理，天沟要注意流水坡度及水落斗处构造，卷材每卷之间粘接、搭接长度不少于80mm，屋面防水施工前，要检查其屋面层含水率≯10%，卷材采用热熔法施工。天沟、檐口、泛水处，再加做一层防水卷材，泛水上卷高度不少于250mm。&lt;/p&gt;
&lt;h3&gt;5. 屋面防水施工&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;防水施工顺序、材料等控制
弹性体沥青防水卷材的施工是的重点，屋面要求在结构完工及其它交接工序完成并验收合格后进行施工。
&lt;ol&gt;
&lt;li&gt;屋面施工顺序
学习图纸、规范，领会要点→材料进场验收→施工交底；施工做法见前所述。&lt;/li&gt;
&lt;li&gt;屋面施工材料的控制
本工程为了确保创优的目标实现，对屋面材料将严格按公司质量体系要求进行材料组织到现场，对进场材料并按有关程序要求进行复检合格后方可使用，对屋面所用材料必须提供合格证外，对防水卷材及胶结剂等必须抽样复检。&lt;/li&gt;
&lt;li&gt;屋面关键工序的施工
防水卷材的施工是屋面工程的关键工序，在此施工期间，要求操作人员实行持证上岗，对已确定的人员必须保持相对稳定。各个单体工程按8人组成一个施工组，其中，涂刷基层处理剂及胶粘剂2人，铺卷材4人，接缝和嵌填缝材料2人，其操作工艺如下：
a. 基层处理：在铺设卷材前，须将基层表面的突起物、砂浆等异物铲除，并清扫干净。
b. 复杂部位的附加层施工：水落口、管道根部、阴阳角等是易发生渗漏的薄弱部位，做好园弧形泛水，并铺贴卷材附加层。
c. 涂布基层胶粘剂：在胶粘剂搅均匀后，将卷材展开摊铺，在平坦干净的基层上，均匀地涂布在表面上。但搭接缝部位的80mm处不涂刷，待胶粘剂干燥30min后，手触基本不粘时，即可进行铺贴施工。
d. 铺贴卷材：铺贴时按先低后高、先远后近的顺序，在同一跨内按先铺贴排水集中部位，并按排水坡由下而下配置卷材的方案施工，从流水下坡开始弹出基准线，使卷材的长向与流水坡度相垂直。
e. 卷材接缝的粘结：卷材接缝的搭接宽度不小于80mm。在接缝部位每隔1m左右，涂刷少许胶粘剂，待其基本干燥后，再将搭接部位的卷材翻开固定。
f. 卷材接缝边缘的密封处理：采用双组份的聚氨脂密封处理。
g. 卷材末端收头部位的密封处理：卷材末端收头均应裁剪整齐，压入预留凹槽内，并用压条固定，然后填嵌聚氨脂密封膏封严。&lt;/li&gt;
&lt;li&gt;屋面一般工序的施工要点
a. 各种管道穿过屋面板时，管根部砼板防水堵洞及防水构造做法按设计图所示施工。
b. 水泥砂浆找平层施工要求做到粘结牢固，平整光滑、无空鼓等现象。找平层上铺贴时，其干湿度以1平方米卷材平坦铺在卷材上静置3--4h后，掀开检查未见明显水印即为符合要求干燥施工。
c. 基层胶粘剂可采用空铺法或条粘法，要求涂刷均匀，不露底，不堆积。
d. 屋面排气构造设置，按6m*6m对找平层设分仓缝作排气道，缝宽30mm，要求纵横贯通设置，并在每36平方设排气孔一个。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;屋面工程施工前，凡进入隐蔽工程的施工项目时，应对前分项分部工程进行验收。防水施工前，基层应干燥、平整、光滑，阴阳角要做成小圆脚。屋面工程施工时，注意掌握温度，保证防水功能，无渗漏现象，其构造和防水保温层必须符合设计要求。屋面工程施工完成后，应采取妥善保护措施防止损坏。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;施工操作
&lt;ol&gt;
&lt;li&gt;施工准备
对进库防水卷材应进行抽样复试，其抗拉强度、延伸率、耐热性、低温柔性以及不透水性均应达到规定指标。&lt;/li&gt;
&lt;li&gt;按前述要求执行。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;施工工序
施工顺序：清理基层→试铺、弹线→卷材→辊压、排气→搭接缝密封处理→清理、检查、验收。
&lt;ol&gt;
&lt;li&gt;清理基层：找平层表面必须清理干净，特别是檐沟、 落水口、排气道内的杂物均应清理干净。&lt;/li&gt;
&lt;li&gt;铺贴防水卷材：施工前先将卷材打试铺， 在基层上弹线定位。卷材长边搭接7cm，短边搭接10cm。&lt;/li&gt;
&lt;li&gt;防水卷材铺贴要保持松弛态，不宜拉紧， 铺贴时应用压辊由卷材中央向两端压实，赶出气泡，避免空鼓、皱折。&lt;/li&gt;
&lt;li&gt;防水卷材之间接缝粘结：待大幅卷材铺贴后， 对压实粘牢的接缝处，亦可再用密封膏进行封口处理，以确保严实。&lt;/li&gt;
&lt;li&gt;屋面防水卷材施工前，应将管道根、落水口等节点周围以及转角处的卷材剪开，采用密封膏封固。&lt;/li&gt;
&lt;li&gt;屋面防水卷材施工完毕后， 应认真检查接缝和各节点部位的粘贴密封质量，以保证防水层整体质量严密，不渗水。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;细部处理
卷材防水屋面一些细部大多数是变形集中表现的部位，如结构变形，基层和防水层收缩及温差变形等，这些部位易产生开裂而导致渗漏。对这些部位简称为&amp;quot;一头、二缝、三口、&amp;quot;采取以下处理方法：
&lt;ol&gt;
&lt;li&gt;一头-卷材收头
女儿墙四周留设1/4砖槽，槽下部采用水泥砂浆抹成斜面，卷残压进槽内，用粘结剂封严，再用水泥砂浆抹女儿墙时抹收头。&lt;/li&gt;
&lt;li&gt;二缝-变形缝、分格缝
变形缝：在变形缝上铺贴2层（附加一层）防水卷材，各粘贴一边，以适应沉降变形的需要。&lt;/li&gt;
&lt;li&gt;出入口：屋面的洞口容易踏破卷材引起渗水，因此在出入口，采用双层防水卷材铺贴，以增强防水能力。
落水口：为保证屋面雨水迅速排出，落水口应低于檐沟，而檐沟必须坡向落水口，在初抹后还要试水试验，以保证坡度的正确。
管道根部采用细石混凝土拍成锥形，粘贴防水卷材时（底部先贴一层附加层），上部剪成三角形与管道粘贴牢固，并用密封膏封固。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6. 检查验收&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;屋面防水卷材贴完验收后，必须将卷材物理性能的检查报告及其他有关资料收集归档。&lt;/li&gt;
&lt;li&gt;屋面不应有积水渗漏现象存在。检查积水或渗漏的一般方式有三种：a.在下雨后进行；b.浇水进行；c.蓄水的方法。&lt;/li&gt;
&lt;li&gt;防水卷材的接缝必须粘贴牢固，封闭严密，不允许有皱折、孔洞、脱层、或滑移和其它缺陷。&lt;/li&gt;
&lt;li&gt;落水口周边以及防水卷材的未端（收头）必须封闭粘贴牢固，并要把落水口和檐沟的尘土、杂物清扫干净，以确保排水畅通。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;屋面工程施工时，注意掌握温度，保证防水功能，无渗漏现象，其构造和防水保温层必须设计要求。屋面工程施工完成后，应采取妥善保护措施防止损坏。&lt;/p&gt;
&lt;h3&gt;7. 成品保护&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;已做好的卷材防水层，应及时采取措施加以保护，防止损坏，带来后患。&lt;/li&gt;
&lt;li&gt;穿过屋面、墙面等处的管根不得碰撞、损坏和变位。&lt;/li&gt;
&lt;li&gt;天沟、排水口、变形缝等处因施工需要临时堵塞的纸袋、麻绳、塑料布等应彻底清除干净，保持畅通。&lt;/li&gt;
&lt;li&gt;防水层施工后应及时做好保持层，着色剂保护层未干燥固化前不得上人走动。&lt;/li&gt;
&lt;li&gt;在涂刷底胶、增补处理剂及站结等工序中，不得污染墙面及门窗等部位。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第8节 装饰工程&lt;/h2&gt;
&lt;h3&gt;1. 天棚抹灰施工&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;工艺程序
基层处理→弹天棚水平线→喷水润湿→刷107 胶水泥浆→抹底层糙灰→抹中层糙灰→找平层检验→抹罩面灰。&lt;/li&gt;
&lt;li&gt;施工要点
&lt;ol&gt;
&lt;li&gt;基层处理：楼板底面凡是有突出的砂浆或砼，均应剔平，表面光滑的用剁斧砍毛，表面的凹坑，应清洗后用1:2水泥砂浆分层补平。&lt;/li&gt;
&lt;li&gt;天棚抹灰：在靠近天棚的墙面上弹出水平线，作为抹灰厚度和阴角平直的控制线，同时拉线检查楼板底面平整度情况，对凹面较大的应划上记号作为刮糙灰重点加厚的目标，加厚层应分层找平，每层厚度不宜超过7mm。抹灰前一天将板面浇水湿透。抹灰前，先用喷雾器喷水湿润板面，待板面无明水时，刷107胶水泥一遍，紧接着抹1:1水经砂浆底糙灰，在底糙灰内加水泥重量5-10%的107胶水，抹底糙要力抹压，养护2-3d后抹找平层糙灰。抹中层糙灰（找平层糙灰）：抹灰前用喷雾器喷水湿润表面，接着用混合砂浆补局部低凹不平之处，隔一夜再用混合砂浆抹找平层，先用软刮尺刮平，再用木抹子搓平表面，梁和天棚的阴、阳角处，应用阴阳角尺通直，使楞角方正、整齐、角度一致。找平层砂浆凝固后，用喷雾器喷水润湿，接着抹水泥砂浆罩面灰。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 内、外墙面抹灰&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;工艺程序
基层处理→柱、墙抹护角→润湿墙面→抹底糙灰→抹墙裙或踢脚线底糙灰→抹墙裙或踢脚线中层糙灰→插入天棚、地面施工→润湿墙面→抹罩面灰。&lt;/li&gt;
&lt;li&gt;施工要点
基层处理：将基层表面的灰尘、污垢和油渍等清除干净，用沥青麻刀将门窗框与墙的间缝填塞严密，并用水泥浆嵌补平整密实，同时将脚手眼及水电暗管安装后的孔槽分层填实补平，将砼基体表面洗刷或凿毛，加气砼墙面应先勾缝和修补缺棱掉角。
检查墙平整度和垂直度，从房间的四角起吊垂直线做灰饼，每隔1.2-1.5m打一个灰饼, 灰饼砂浆配合比和糙灰相同，灰饼砂浆凝固后进行出柱，柱两侧应割整齐，灰饼及结构的上表面和找平层相平，随后用水泥砂浆做门口阴角和墙、柱转角的护角。护角高度在2m以上，每侧宽度取50mm。护角为三遍成活，即两遍糙灰，一遍罩面灰。
抹底糙灰：抹灰前洒水润湿墙面，特别是加气砼墙，吸水量大，吸水慢，应提前2d多次洒水湿透，事先用混合砂浆勾缝和修补缺棱掉角。砼及加气砼墙均应先刷一遍107胶水泥浆，刷后紧接着抹灰，不能让107胶水泥浆干燥，抹灰时要用力抹压，将砂浆挤入墙缝中，达到糙灰和基层紧密结合的目的。
抹中层糙灰：待底层糙灰凝固后抹中层糙灰，采用分层填抹，用长刮尺赶平，阴阳角处用阴阳角尺通直，然后用木抹子搓平表面，做到表面毛、墙面平、棱角直。做完墙面糙灰以后，再做墙裙或踢脚的糙灰，墙面和墙裙或踢脚糙灰做完后，进行局部修整，经检验合格后再做罩面灰及罩面宝珠涂料。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 外墙涂料施工&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;涂料面施工工艺流程
清理基层→填补缝隙→磨砂纸→满刮腻子两遍→磨光→刷第一遍涂料→复补腻子→磨光→刷第二遍涂料→磨光→刷第三遍涂料→拆除脚手架。&lt;/li&gt;
&lt;li&gt;施工要点
基层处理：基层表面的尘土、脏物事先清扫或铲除，基层含水率不得大于10%。
刮腻子：腻子随用随调一次调配的数量最多不得超过2d，在找补腻子时，对孔缝深的应分二次或三次补平，待腻子干透后，用砂纸打磨光滑即可涂刷涂料。
刷涂料：涂刷涂料的施工温度应按产品说明的要求控制，防止冻结。涂刷前，先将涂料搅拌均匀，如感太稠，可以加水稀释，但加水量不应超过20%， 涂刷涂料用排笔涂刷，从一头开始，顺着逐渐刷向另一头，每个刷面应一次完成，以避出现接头。第一遍涂料刷过之后，遇有局部透底，厚薄不均，不能用补点方法处理，必须满刷一遍才能保证色泽一致。最后一遍涂料要一笔一笔挨着刷直，不得成弧形，做到刷纹顺直、厚薄均匀、不显接砂、无流坠、溅沫、透底等质量问题。涂刷遍数应根据颜色深浅和涂料遮盖力情况确定，至少三遍。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4. 木门安装、油漆&lt;/h3&gt;
&lt;h4&gt;1. 木门安装&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;施工工艺流程
弹水平控制线→门框固定→检查校正、钉牢→门框周边缝嵌填→安装门扇及小五金&lt;/li&gt;
&lt;li&gt;施工要求：
门框位置必须符合设计规定，钉要牢固、平直，与墙间空隙应用沥青麻刀灰填塞密实，不得污染表面。
安装门扇应裁口顺直，刨面平整光洁，并开启灵活，稳定且无自关现象，缝隙均匀一致，棱角应整齐，无刨痕、毛刺。
小五金应位置适合、槽深一致、边缘整齐、尺寸准确、装配齐全、木螺丝拧紧卧平、插销关启灵活。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;2. 油漆施工&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;施工工艺流程
清打、起钉、除油污→去脂襄、修复平整→打磨→节疤处漆片点→打油底→局部刮腻→磨光→腻子处涂油→第一遍油漆→补腻子→磨光→第二遍油漆。&lt;/li&gt;
&lt;li&gt;施工要求：
油漆施工时，门的材质含水率不大于18%。
油漆在抹灰、木装修、楼地面及外墙面、水电安装等工程完后进行。
施工前按设计要求先做样板，经设计、建设单位认可后方能大面积施工。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5. 门窗安装&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;用于制作门窗的材料规格，型号及配件应符合设计要求，色彩一致。
门窗制作应尽可能地在施工现场制作，这样可以大大减少门窗的包装与运输工作量，特别是当门窗的加工尺寸较大时，可以减少因搬运和堆码不当所产生的变形，也能够保证门窗的制作质量，核对门窗的型号、规格、尺寸、数量发现问题可及时进行调整，以免造成不必要的浪费。门窗制作的工序为：断料→钻孔→组装→保护或包装，断料前应按照门窗各杆所需要的长度划线，按线用切割设备断料，断料时应根据设计图纸的规格、尺雨结合所用型材的长度，长短搭配，合理用料，减少短头废料，切割时应保证切割的精度，克其是切割具有一定角度的斜面时，更要十分注意，以免影响组装的颜一致，以免影响美观。
一般推拉门窗断料宜采用直角切割，平开门、窗断墙宜采用45°切割。
在进行钻孔前，应先在工作台或型材上划好线，量准孔眼的位置，经核对无误后，再进行钻孔，以免钻出废孔难以修复，型材、杆件钻孔，批量生产时宜用小型台钻，以确保孔位的精度，也可采用手枪式电钻，携带方便，操作灵活，但要求操作人员应将孔位定准，钻头垂直，以确保钻孔的质量。
门窗组装完毕后应对其进行保护，一般可用塑料胶纸，塑料薄膜等材料，将所有杆件的表面严密包裹起来，尤其是门窗框的表面上，避免使表面氧化膜遭到破坏，影响质量，包装好的门窗要做好标志，在堆放和运输时严禁平放，必须竖放，以减小门的受力变形。
门窗的制作必须保证表面平整，节点严密，不变形规格尺寸准确，构件表面无划痕、无碰撞，窗下坎制作要留2-3个椭圆形泄水孔，不允许在下坎框角上开槽口做泄水孔。&lt;/li&gt;
&lt;li&gt;门窗安装：门窗安装的时间，应选择主体结构基本结束后进行，扇安装的时间宜选择在室内外装修基本结束后进行，以免土建施工时将其损坏，安装门窗框前应逐个核对门窗洞口的尺寸，与门窗的规格是否相适应，在安装门窗框前必须与施工技术人员共同放好三条线：一是门窗的水平线、二是中心线、三是门窗洞口两侧与外墙面层距离的垂直线，外墙同一位置的竖框应在同一垂直线上，根据在洞口上弹出的门窗位置线，按照设计要求，将门窗框立于墙的中心线部位或内侧，然后用木楔进行临时固定，待检查立面垂直、左右间隙大小、上下位置一致，均符合要求后，再将镀锌锚板固定在门窗洞口内。
门窗框与洞口的间隙应采用矿棉玻璃棉毡条分层填塞，缝隙表面５－８mm深的槽口，填嵌密封材料，在施工中注意不得损坏门窗上面的保护膜，严禁利用安装完毕的门窗框搭设和捆绑脚手架，避免损坏门窗框。
门窗的各种附件应安装齐全，位置正确、牢固、灵活、适用、端正、美观，密封胶条四周要胶圈，不准接条，转角胶条到位，转角胶条要割成45°斜角，再用胶粘牢，防止回弹，胶条安装严密、平直、显露均匀，防止松动，门窗使用密封胶固定玻璃时，先用胶垫把玻璃垫稳，垫平，不得使用有划痕的玻璃，门窗扇用密封胶抹胶时，要平直，均匀不间断，不漏抹，无胶刺，门窗扇胶应清理干净，不允许使用密封膏固定玻璃。
门窗框一定要在施工现场各楼层进行分别组装，为了确保窗框的稳定性，中立框与中立框之间必须要有连结方型框料，要挤满密封胶，再用螺丝固定严密，螺丝钉要拧紧拧平，框与框之间的缝隙不得大于0.1mm。
门窗交工前，应将型材表面的塑料胶纸撕掉，如果塑料胶纸在型材表面留有胶痕，宜用香焦水清洗干净。门、窗框扇可用水或浓度为1％－5％、PH值为7.3-9.5中性洗涤剂充分清洗，再用布擦干，不应用酸性或碱性制剂清洗，也不能用钢刷刷洗。玻璃销用清水擦洗干净，对厚灰或其它杂物，要全部清除干净，待定位销孔和销对上后，再将定位销完全调出，并插入定位销孔中，涂胶表面光滑，平整厚度均匀，无气孔。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6. 乳胶漆施工方法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;准备工作
a. 材料准备：内墙刮墙腻子、封底漆、乳胶漆。
b. 施工工具：基层处理工具有刮刀、扫帚等；涂刷工具有毛刷、涂料滚子、托盘、手持电动搅拌器、空气压缩机、喷枪；劳保用品有口罩、手套、工作服等。
c. 作业条件：对涂料施工有影响的其他土建及水电安装工程均要求已施工完毕，并预先加以覆盖；室内水、暖、电、卫设施及门窗等都需要必要的遮挡；抹灰墙面不得有起皮、起砂松散等缺陷，正常气候条件下，一般抹灰面不得少于14天，混凝土基材龄期不得少于一个月；施工环境温度应高于5℃；相临施工环境不得有明火施工。&lt;/li&gt;
&lt;li&gt;施工工艺
a. 基层处理：基层清理，将墙面基层处的粘杂物清理干净，提前一天湿润基层。
b. 内墙为石膏复合板时应先刷一道掺有107胶水的素水泥浆。
c. 找规矩、做灰饼：用一面墙做基准先用方尺规方。房间面积较大时应先在地上弹出十字中心线然后按基层面平整度弹出墙角线。随后在距墙阴角100mm处吊垂线并弹出铅垂线，再按地上弹出的墙角线往墙上翻引弹出阴角两面墙上的墙面抹灰层厚度控制线，以此做灰饼。
d. 冲筋：在灰饼间抹灰厚度与宽度与灰饼同。上下水平抹盘应在同一铅垂面内。一般情况下，冲完筋约4h左右可以抹底灰。
e. 底灰分层分遍与冲筋抹平。底灰为15mm厚，第一层抹灰厚度为6-7mm
f. 底子灰5-6成干时即可抹罩面灰。罩面灰为5mm。&lt;/li&gt;
&lt;li&gt;刷乳胶漆：
a. 基层清理：检查基层平整度，将墙面基层处的粘杂物清理干净，将影响面层厚度的凸出部位剔除平整。
b. 检查基层，填补缝隙，局部处刮腻子。
c. 满刮腻子一遍：腻子应具有良好的可塑性和易刮涂性。干燥后应粘结牢固，不起皮、龟裂和粉化。
d. 刷涂用毛刷操作。刷涂的顺序是先左后右、先上后下。待第一遍乳胶漆干后，方可刷第二遍。两次涂间隔时间4h以上。&lt;/li&gt;
&lt;li&gt;质量要求
a. 掉粉、起皮 不允许
b. 漏刷、透底 不允许
c. 返碱、咬底 不允许
d. 流坠、疙瘩 不允许
e. 颜色、刷纹 颜色一致，无砂眼，无刷纹
f. 装饰线分色线平直 偏差不大于1mm
g. 门窗、灯具 洁净&lt;/li&gt;
&lt;li&gt;施工注意事项
a. 各种涂料的稀释方法、施工温度及使用方法等，应严格执行使用说明书的规定。一个工程所需涂料应为同一批号的产品并一次备齐。涂料在使用前及使用过程中，应经常搅拌。
b. 涂料的存放与运输按使用说明书的规定进行。一般水性涂料应密封存放在0℃以上的室内。溶剂型涂料还需严防烟火。
c. 喷刷涂料后至成膜前应避免淋水，风雪天应停止施工。风力在四级以上时，不得进行喷涂施工。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;装修分类：装饰工程按部位主要分为三大块，天棚面装修、内墙面装修及外墙面装修。按其工作内容又分为初装修、精装修。&lt;/p&gt;
&lt;p&gt;装修内容：&lt;/p&gt;
&lt;p&gt;内墙：白色乳胶漆、混合砂浆。&lt;/p&gt;
&lt;p&gt;外墙：白色彩砂涂料和水刷石。&lt;/p&gt;
&lt;p&gt;楼地面：水泥砂浆和陶瓷地砖。&lt;/p&gt;
&lt;p&gt;顶棚：混合砂浆顶棚。&lt;/p&gt;
&lt;p&gt;塑钢门窗，木门等。&lt;/p&gt;
&lt;p&gt;施工组织：先初装修后精装修。初装修先室内后室外、先天棚墙面后地面。施工时应先室内、后室外、楼梯、过道，先湿作业后干作业，先抹灰后木作最后油漆的原则施工，待初装修全部完毕后再进行施工。外墙抹灰随顶层砌体完成后，由上至下组织完成。室内精装修待屋面及初装修完成后组织完成。室内精装修按先墙面后顶棚、而后地面，室内精装修可按房间采用穿插施工，各工序可同步进行。施工前，先做样板，经建设方、设计、监理方认可后，其余层间再按样板组织有序的施工，并建立样板施工制度。质量检查以样板间为准。&lt;/p&gt;
&lt;h2&gt;第9节 楼地面工程&lt;/h2&gt;
&lt;h3&gt;1. 水泥砂浆楼地面&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;基层清理：将地面基层、地墙相交的墙面、踢脚板处的粘杂物清理干净，影响面层厚度的凸出部位应剔除平整。
洒水润湿：在施工前一天洒水润湿基层。&lt;/li&gt;
&lt;li&gt;抹踢脚板：有墙面抹灰层的踢脚板， 底层砂浆和面层砂浆分两次抹成；无墙面抹灰层的只抹面层砂浆。&lt;/li&gt;
&lt;li&gt;踢脚板抹底层水泥砂浆：清理基层，洒水润湿后，按标高线向下量尺至踢脚板标高，拉通线确定底灰厚度，套方，贴灰饼，抹1:3水泥砂浆，刮板刮平搓平整，扫毛浇水养护。&lt;/li&gt;
&lt;li&gt;踢脚板抹面层砂浆：底层砂浆抹好，硬化后，拉线贴粘靠尺板，抹1:2水泥砂浆， 抹子压抹上灰后用刮板紧贴靠尺垂直地面刮平，用铁抹子压光，阴阳角、踢脚板上口，用角抹子溜直压光。&lt;/li&gt;
&lt;li&gt;刷素水泥浆结合层：宜刷1:0.5水泥浆，也可在垫层或楼板基层上均匀撒水后，再撒水泥面，然后扫涂形成均匀的水泥浆粘结层，随刷随铺水泥砂浆。&lt;/li&gt;
&lt;li&gt;冲筋贴灰饼：根据＋50cm标高水平线，在地面四周做灰饼，大房间应相距1.5至2m增加冲筋， 如有地漏和有坡度要求的地面，应按设计要求做泛水和坡度。&lt;/li&gt;
&lt;li&gt;铺水泥砂浆压头遍：紧跟贴灰饼冲筋铺水泥砂浆，配合比为水泥:砂＝1:2，用木抹子赶铺拍实，用木尺按贴饼和冲筋标高刮平，上木抹子搓平，等反水后略撒1:1干水泥砂子面， 吸水后铁抹溜平，上述操作均在水泥砂浆初凝前进行。&lt;/li&gt;
&lt;li&gt;第二遍压光：在压平头遍之后，水泥砂浆凝结，人踩上去稍有脚印，抹子抹上去不再有抹子纹时，用铁抹子压第二遍。要求不漏压，平而出光。&lt;/li&gt;
&lt;li&gt;第三遍压光：水泥砂浆终凝前进行第三遍压光，人踩上去稍有脚印，抹子抹上不再有抹子纹时，用铁抹子把第二遍压光留下的抹子纹子纹压平、压光，达到交活的程度。&lt;/li&gt;
&lt;li&gt;养护：地面压光成活后24h， 铺锯末撒水养护并保持湿润，养护时间不少于15d。养护期间不允许压重物和碰撞。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 地砖楼地面&lt;/h3&gt;
&lt;p&gt;地砖地面的做法按以下做法实施。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基层清理：应注意清理表面残留的砂浆、尘土、油渍等并用水冲洗地面。&lt;/li&gt;
&lt;li&gt;弹线、定位
地砖铺贴通常有两种方式：
a. 对角定位法--砖缝与墙角成45°角。
b. 直角定位法--砖缝与墙面平行。
弹线时以房间中心点为原点弹出相互垂直的定位线。弹线定位注意事项：
a. 应距墙边留出200--300作为调整区间。
b. 门口不应出现非整砖、非整砖应放在房间 不显眼的位置。&lt;/li&gt;
&lt;li&gt;设置地面标准高度面按铺地砖的工艺，较小房间做丁字形，较大房间做十字形，贴两行地砖。&lt;/li&gt;
&lt;li&gt;铺贴
a. 地砖在铺贴前应先用清水浸泡2-3h，取出晾干再用。
b. 铺基层上水泥素浆应刷均匀；不漏刷，不积水，不干燥；随刷随铺摊结合层，结合层砂浆为25厚1：4干硬性水泥砂浆；做干撒水泥时应撒匀，浇水要均匀而少量；铺贴时，水泥浆应饱满的抹于瓷砖背面，并用橡皮锤敲实，并且一边铺贴 边用水平尺检查校正，同时立即擦去表面的水泥浆。&lt;/li&gt;
&lt;li&gt;铺贴完养护2天后，进行干水泥擦缝。将白水泥调成干性团，在缝隙上擦抹，使瓷地砖缝内填满白水泥，再将瓷砖表面擦净。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本工程的地面装饰主要有水泥砂浆地面和地砖地面等。&lt;/p&gt;
&lt;h2&gt;第10节 设备安装工程&lt;/h2&gt;
&lt;h3&gt;1. 施工准备&lt;/h3&gt;
&lt;p&gt;土建工程开工后，设备安装工程进入施工前的准备阶段：当进入基础（地下室）工程的施工时，设备安装工程的预埋工作开始，设备安装人员配合土建进行施工。&lt;/p&gt;
&lt;h3&gt;2. 施工方法&lt;/h3&gt;
&lt;p&gt;本工程设备安装工程的施工工期比较紧张，设备安装人员必须穿插进行施工。设备安装采取分路同时安装，根据施工进度、天气情况，随时调整。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;给水、排水管道安装
管道安装：安装前必须清除内部污垢和杂物，防止阻塞。
管架制作安装：严格按施工图纸要求下料、焊接，经过防锈处理后，安装在承重结构上，位置要正确，埋设平整牢固，与管道接触紧密。
给排水管道安装：给水横管要有坡度，坡向泄水装置：排水管径和最小坡度应严格按设计要求其规范施工。
管道连接：给水管道采用镀锌钢管，丝扣连接；室内排水管和出户管采用排水铸铁管，石棉水泥接口。
防腐：明装镀锌钢管、铸铁管道表面要清理干净，用防腐材料粉刷。&lt;/li&gt;
&lt;li&gt;电气安装
电气安装交叉施工多、任务重，因此要做好相互协调工作，紧密配合土建、设备及其它工种。
配电：电力电缆埋地入户。配电系统采用三要五线制。入户处作一个接地系统，其接地电阻小于10欧姆。&lt;/li&gt;
&lt;li&gt;防雷、接地：屋面上做避雷带，沿其避雷带线路将基础底板内的4根Φ8分布钢筋焊接贯通，形成导电网路。防雷引下线利用构造柱内两根主筋焊接贯通，顶端与屋面防雷带焊接，屋面金属管件与防雷带焊接，引下线底部与基础内形成导电网路的4 根Φ8分布筋焊接。防雷接地电阻小于10欧姆。预埋、预留、 设备施工：现场施工的技术人员，应对预埋件、洞口尺寸位置进行检查，填写预埋件等隐蔽工程验收单。设备工程中的预留洞，预留管道均应在土建施工中穿插进行，避免以后打洞开槽。钢筋混凝土结构施工中，水、电等必须密切配合施工。在进行后期水施、电施设备安装施工时，土建必须与设备相配合。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本工程主要分为以下几个系统：给排水、照明电气、消防灭火系统等。&lt;/p&gt;
&lt;h1&gt;第10章 施工技术组织措施&lt;/h1&gt;
&lt;h2&gt;第1节 采用新技术、新工艺、新材料&lt;/h2&gt;
&lt;p&gt;本工程拟采用建筑业推广应用的新技术，现仅对计算机现代化管理系统应用的可行性分析如下：&lt;/p&gt;
&lt;p&gt;为提升建筑工程施工现代管理水平，进一步推进项目部在施工管理过程中的计算机应用，使企业的整体竞争力和项目管理科学化得到较大的提高，我公司针对本工程的特点，配置项目管理软件，定期对管理人员进行培训。&lt;/p&gt;
&lt;p&gt;公司将在本工程施工管理过程中应用&amp;quot;三大控制&amp;quot;、&amp;quot;两大管理&amp;quot;软件系统，解决施工计划管理、进度控制、透明延伸，以人为本的管理平台应用管理系统。&lt;/p&gt;
&lt;p&gt;同时，施工现场将采取现代化管理方式：全面进行办公室计算管理、人事管理、材料管理、财务管理、预算管理、劳资管理、建筑资料管理、成本核算等各个方面，方便、准确、快捷使项目管理系统化、智能化、规范化。&lt;/p&gt;
&lt;p&gt;拟采用新工艺、新技术、新材料&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;钢筋连接接头施工工艺。&lt;/li&gt;
&lt;li&gt;混凝土高效外加剂的应用。&lt;/li&gt;
&lt;li&gt;推广现代管理技术与计算机应用。&lt;/li&gt;
&lt;li&gt;推进项目管理信息化建设。&lt;/li&gt;
&lt;li&gt;清水混凝土的运用。&lt;/li&gt;
&lt;li&gt;推行先进的质量管理模式。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第2节 建立严格的技术管理体系&lt;/h2&gt;
&lt;p&gt;我公司针对该工程的特点，特派施工管理能力强、技术专业性高、施工经验丰富、工作责任心强的人员组成现场技术管理体系，由我方工程技术质量人员组成，主要解决施工过程中碰到的技术问题，严格控制工程施工质量。施工技术人员在单项工程施工前，按照施工方案，精心组织施工以此来保证工程的顺利进行。&lt;/p&gt;
&lt;h2&gt;第3节 施工过程技术控制&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;施工前，认真组织各专业技术人员，熟悉掌握图纸和进行专业技术图纸会审，进行设计交底，施工技术交底。在分部分项工程施工中，每进行一道工序，经检查验收不合格的，不准进行下道工序，对操作人员先进行技术交底，用简明文字构成施工任务单，发给各操作人员后再施工。&lt;/li&gt;
&lt;li&gt;必须严格遵守技术复核制度，对建筑物的方位、标高、高度、轴线、图纸尺寸、误差等作复核记录，工程监理人员复查，无误后进行资料存档管理。&lt;/li&gt;
&lt;li&gt;认真做好每项技术复核和隐蔽工程验收工作，实行混凝土浇灌令签证制度。如果没有工程技术负责人，监理和有关工长、质检员签字，不出进入下一道工序。隐蔽工程施工时，质量检查人员专业技术负责人和质量检查员必须共同进行监督，确保工程顺利进行。&lt;/li&gt;
&lt;li&gt;严格贯彻实行计量管理各项规章制度。加强施工现场和计量管理工作，督促现场专职计量人员做好计量器具的使用和保管工作。对混凝土、砂浆、灰土等准确计量，以确保工程质量。&lt;/li&gt;
&lt;li&gt;专门负责设备安装技术工作的人员，要求在现场办公，处理问题不过夜，实行层层负责、层层交底制度，对施工工艺和特殊施工技术的要求和注意事项，给各班组交代清楚。对涉及修改、质量问题，必须征得建设单位和设计院的同意，针对此问题制定出可靠的技术措施。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第4节 季节性施工技术组织措施&lt;/h2&gt;
&lt;h3&gt;1. 雨季施工管理措施&lt;/h3&gt;
&lt;p&gt;为加强建设工程冬季施工技术管理，确保工程质量，提高经济效益，根据该工程冬季施工项目，特制定技术管理措施：&lt;/p&gt;
&lt;p&gt;为保证建筑物的正常使用，根据该工程的特点和工程要求，因地制宜，采取综合措施，做到技术先进、经济合理，特制定以下措施：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;严格执行国家有关标准、建筑施工规范。&lt;/li&gt;
&lt;li&gt;及时了解现场情况，采取针对措施和加快清理工作，确保工程按期竣工交付。&lt;/li&gt;
&lt;li&gt;在进行基础工程过程中，为了确保工程正常进行，采取有效措施防止雨水浸泡基础。现场布置的临建给水管道，埋地暗敷，所有给水管道、蓄水箱、排污水沟等远离建筑物。给水管道埋置前，先进行水压试验，当确定不漏水时方可使用。&lt;/li&gt;
&lt;li&gt;主要施工机械设置防雨蓬，确保机器正常运转，雨天不影响正常施工。&lt;/li&gt;
&lt;li&gt;混凝土浇筑时，设置宽幅面防水塑料雨布，雨天边浇筑、边覆盖。逢雨季时，穿插室内作业，工期不受影响。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为防止雨季施工期间，场地内必须排水畅通无阻，电气设备必须有防雨、防雷、避雷措施。机座要保持一定的高度，配电箱、电机、电焊机等要有防雨罩，各类施工机械设备，应在雨季之前普查一遍，做到安全可靠。&lt;/p&gt;
&lt;h3&gt;2. 冬季施工管理措施&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;明确责任，做好冬季施工技术交底，确保每个工序按规定、规范、技术措施组织施工，要认真做好冬季施工记录，整理好施工技术档案。&lt;/li&gt;
&lt;li&gt;入冬前，要对现场的技术员、工长、施工员、材料员、试验员及主要工种的班组长、司炉工、电焊工、外加剂掺配和高空作业人员进行技术培训，掌握有关冬季施工方案、施工方法、质量标准，掌握必须的技术工作和操作要点。&lt;/li&gt;
&lt;li&gt;在冬季施工过程中，对于防冻剂掺量，原材料和加热、加热设施的管理等各项冬季施工措施，都要设置专人负责，及时做好记录，并由工程主要技术负责人和质量检查人员抽查，随时掌握质量状况，发现问题及时纠正，切实保证工程质量。&lt;/li&gt;
&lt;li&gt;在冬季施工期间，必须指定专人掌握气温变化情况，及时传达气象信息，并随时做好气象记录，并有针对气温骤然降的技术措施和物资准备。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;主要项目工程技术措施：&lt;/p&gt;
&lt;p&gt;① 日平均气温在+5℃以上时，可按常温施工方法进行。&lt;/p&gt;
&lt;p&gt;② 日平均气温在0─10℃，应用热水拌和砂浆， 并掺入拌和水泥用量3%的氯化纳(食盐)，低于-10℃掺入5%的氯化纳。&lt;/p&gt;
&lt;p&gt;③ 施工用材料应做到：&lt;/p&gt;
&lt;p&gt;a. 砂石不许含有冰块，对冻结的材料，必须经融化后方可使用。&lt;/p&gt;
&lt;p&gt;b. 冬季砂浆的稠度，宜比常温施工时适当增加，可通过石灰膏的办法来解决或加大水泥用量。砂浆在使用时，温度不应该低于5℃。&lt;/p&gt;
&lt;p&gt;c. 伴和砂浆用水加热，温度在超过80℃时，应注意水不得直接于水泥拌和，以防止发生假凝现象。&lt;/p&gt;
&lt;p&gt;d. 冬季搅拌水泥砂浆的时间应适当延长，一般要比常温期间增长0.5-1倍。&lt;/p&gt;
&lt;p&gt;e. 严禁使用已经遭冻结的砂浆，不准再以热水掺入冻结的砂浆内重新搅拌使用，也不宜在砌筑的水泥砂浆内掺水使用。&lt;/p&gt;
&lt;p&gt;④ 施工要求：&lt;/p&gt;
&lt;p&gt;保证砂浆在施工过程中，满足最低温度的要求，调制砂浆应做到随用随拌，不应一次调制过多，堆放时间过长。&lt;/p&gt;
&lt;p&gt;对冬季施工有特殊要求的及不在上述范围内的问题，可直接与建设单位、设计部门、监理部门联系，订出专项措施。其它未尽事宜，参见《冬季施工规范》和国家有关标准、文件。&lt;/p&gt;
&lt;p&gt;夏季施工措施见后面相关内容。&lt;/p&gt;
&lt;h2&gt;第5节 其他技术措施&lt;/h2&gt;
&lt;h3&gt;1. 基础&lt;/h3&gt;
&lt;p&gt;基础施工应放在基础砼施工质量的保证上，加强砼养护。&lt;/p&gt;
&lt;h3&gt;2. 主体工程&lt;/h3&gt;
&lt;p&gt;模板：全部采用木模板及木胶合板模板，钢管模板支架；剪力墙、梁模板采用对拉螺栓、木模板刨平、涂脱模剂。施工前，仔细做好模板设计。&lt;/p&gt;
&lt;h3&gt;3. 钢筋现场制作&lt;/h3&gt;
&lt;p&gt;钢筋连接采用机械连接，钢筋试验必须合格。严格控制好钢筋绑扎的施工质量，注意钢筋保护层，钢筋骨架采用点焊固定。&lt;/p&gt;
&lt;p&gt;砼：做好砼配合比试验，严格控制好砼的整个过程的施工，施工中要落实好责任制。&lt;/p&gt;
&lt;h3&gt;4. 砌体工程&lt;/h3&gt;
&lt;p&gt;砌块工程主要控制有三点，即砌体材料质量、砂浆强度及砌筑施工质量、砌块必须选用合格正品；砂浆控制好施工配合比；砌筑施工以中高级工为主。&lt;/p&gt;
&lt;p&gt;内外装修工程要做好样板施工，即装饰材料抓样品封存验收，装饰施工要抓样板墙、样板间，前后工序做好交接责任制。&lt;/p&gt;
&lt;h3&gt;5. 技术交底&lt;/h3&gt;
&lt;p&gt;施工图交底：重点有工程设计特点、做法、抗震处理、节点做法、设计变更交底。&lt;/p&gt;
&lt;p&gt;施工方法及工艺交底：重点为各项技术措施。&lt;/p&gt;
&lt;p&gt;分项工程技术交底：主要有技术安全交底、规范交底、施工验收标准交底、质量交底。&lt;/p&gt;
&lt;p&gt;重点部位重点交底：主要有质量通病的防范措施交底，新工艺、新材料、新技术交底。&lt;/p&gt;
&lt;p&gt;落实质量责任制，本工程中，项目经理为第一责任人，其他各职能管理人员、施工人员均承担相应的质量责任。&lt;/p&gt;
&lt;h3&gt;6. 电气及防雷接地&lt;/h3&gt;
&lt;p&gt;电气及防雷接地安装工程质量控制及保证措施&lt;/p&gt;
&lt;p&gt;本工程电气安装工程是建筑工程中的关键组成部分，其施工质量的优劣直接影响着本工程的质量水平，因此，本工程必须将电气安装工程作为重点，其质量控制及保证措施有三个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;电气安装工程的前期质量管理
&lt;ol&gt;
&lt;li&gt;电气施工图的质量控制：工程施工前须熟悉电气施工图，并结合图纸会同建设方、设计院、当地电力、电讯、有线电视等主管部门，认真组织搞好施工图纸会审，审重点：变配电房、配电系统、管线敷设、配电箱盘、防雷接地等，核实主要电气设备、材料的使用规格、要求。同时做好与土建中各专业的协设，解决好各专业间的错、碰、漏等问题，尤其是做好设备安装基础、变配电室地坪、电缆沟、土建留洞、预埋管、柱内钢筋的防雷引下线、地梁钢筋与桩基础钢筋的接地系统的焊接等内容的技术交底。&lt;/li&gt;
&lt;li&gt;主要电气设备材料的质量控制：水电设备安装工程、各种电气设备材料的品种、规格较多，用量较大，为确保本工程安装质量，本工程对电气安装工程、电气设备、材料实行统一管理，统一采购，采购的设备、材料应提供相应的质保书、合格证、测试报告等技术保证资料，部分材料应经过当地质检部门检测合格。另外，对进场设备、材料要实行样品封存管理，设备、材料要有专业材料员管理好，做好防雨、防锈、防腐、防碎等工作。&lt;/li&gt;
&lt;li&gt;抓好施工队伍的全面管理，总承包单位应抓好总包与协作单位的关系，检查其技术力量和人员素质、施工资格、上岗证书、技术装备以及安装工程的施工计划、进度安排、安全施工以及施工工艺，确保合格的施工队伍进场施工。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;电气安装工程的现场施工质量管理：
现场施工质量管理是电气安装工程的核心，在工程施工前，对所有施工单位的施工人员以及质量管理人员，就施工图纸、施工内容、安装要求、隐检要注、质量验收细则统一交底，施工时应根据《电气装置安装工程》(GB50257-96)的要求，配合相关的电气安装标准、图集、规范施工，及时做好工序交接验收，以及隐蔽工程检查、记录等，现场施工质量的保证措施主要有以下几点：
&lt;ol&gt;
&lt;li&gt;配管、电气管材均采用设计要求的阻燃PVC硬塑管，管径、材质应符合设计要求，施工中，线管的弯管半径应≥6d，煨弯时采用煨管器，配管连接采用配用的外接件，长度不小于3d，线管用专用PVC胶水粘接牢固，线管埋入砼及墙体内时，其四周保护层厚度不小于20mm。预埋中，凡通过接线盒敷设的管子，管内的穿线不应切断，待线盒整理时再进行断开，线盒要安装整齐、美观。在与土建交叉作业中，在楼地面上的管线敷设后，要加强保护，在需要用车、行人的地方铺设过道，防止人踩车轧、落地重物打击等，若发生，应立即通知电工，及时修复。&lt;/li&gt;
&lt;li&gt;敷线：敷线所用导线的电缆应符合设计要求，为了保证敷线质量，导线采用各专业队伍协作施工，以保证相线、中性线、保护线不混淆。本工程导线分色统一为三相线A相黄色、B相绿色、C相红色、中性线蓝色、保护线黄绿相间色、单相线红色、开关控制线绿色，从而保证施工时各导线间的严格区分。敷线时，线管中导线有接头，导线接头处必须设接线盒。导线连接采用压接处理工艺，压接帽规格必须与导线规格一致，压接时，彩专用的压接钳，多股导线理顺后作搪锡处理。导线接入开关、插座的长度不得少于150mm，导线接入接线桩按一线一桩，导线铜芯不得露入接线桩外。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;防雷与接地：
本工程屋面有塔楼及各种专业电气、电信设备，施工时要抓好专用防雷与接地装置，更应注意其安装质量。
&lt;ol&gt;
&lt;li&gt;基础联合楼地体的焊接，重点要保证底网钢筋、桩基础钢筋的焊接部分、焊接质量、搭接长度必须满足设计及施工规范，利用专用电气检测仪器，要检查底板钢筋与柱内钢筋，或者专用引下线是否接成电气通路，并做好隐检记录。&lt;/li&gt;
&lt;li&gt;各层柱内主筋或专用接地引下线的连接采用焊接，质量要求同第1条。&lt;/li&gt;
&lt;li&gt;屋面避雷带和避雷小针安装的净高、小针之间的间距、小针及避雷带的焊接质量应予以重点保证，为此，屋面避雷系统安装时，应先做好安装计划，与土建施工要做好配合。&lt;/li&gt;
&lt;li&gt;配电箱、盘及开关、插座、灯具安装必须符合设计和规范要求，重点要控制好安装方式，安装标高及平直度。箱盘内导线的长度要留有一定余量。多根导线用绑扎线成束，接入接线桩的导线数量不超过2根，接入零线和保护线母线排的导线要有垫片和弹簧垫圈，箱盘内电器件安装牢固平整，接线整齐美观，所有配电箱、盘以及开关插座和面板安装牢固、面板平直、紧贴墙面。配电箱、盘安装结束后，各面板及时标记相应的名称和编号，各出线回路标注回路编号和功能，其文字应通俗易懂、规范。
施工中应注意相线开关接线与开关标记相一致，插座接线保证左零右相，在开关、插座内导线的长度不少开150mm，灯具安装要注意接线正确。&lt;/li&gt;
&lt;li&gt;隐蔽工程的检查和记录，电气安装施工要紧密配合土建，提前在土建施工前做好隐检，当场记录，对于未经隐检而隐蔽的工程，视为不合格。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;电气安装工程的后期质量管理，现场施工基本结束，还应做好后期质量管理，做好成品保护。竣工验收前，对所有电气设备进行清理、编号。检测单位完成绝缘电阻测试、接地电阻测试、漏电保护测试和通电测试等测试项目，并出具检测验收报告。对上述内容的检测报告，应予编制成册。施工单位则依据现场实际实例编制完整的工程竣工图，工程资料汇编成册，作为工程验收的依据和今后建设单位以后维修的原始资料。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其它设备实际安装，待进场后视具体情况另行编制。&lt;/p&gt;
&lt;h3&gt;7. 原材料质量保证措施&lt;/h3&gt;
&lt;p&gt;对原材料材质标准严格把关。材料员对原材料、成品和半成品应先检验后收料，不合格的材料不准进场。&lt;/p&gt;
&lt;p&gt;原材料要具备出厂合格证或法定检验单位出具的合格证明。钢筋、水泥还应注明出厂日期、批号、数量和使用部位，抄件应注明原件存放单位和抄件人并签章。&lt;/p&gt;
&lt;p&gt;对材质证明有怀疑或按规定需要复检的材料，应及时送检，未经检验合格，不得使用。&lt;/p&gt;
&lt;p&gt;各种不同类型、不同型号的材料分类堆放整齐。水泥、钢筋在运输、存放时需保留标牌，按批量分类，并注意防锈蚀和污染。&lt;/p&gt;
&lt;h3&gt;8. 计量保证措施&lt;/h3&gt;
&lt;p&gt;严格执行公司的计量检测网络。&lt;/p&gt;
&lt;p&gt;砼、砂浆、钢筋焊接接头由内业员按规范要求提出取样计划，由试验员取样送试验室检验，不合格不得使用。&lt;/p&gt;
&lt;p&gt;砼搅拌站严格按配合比投料，水泥、砂、石要每盘过秤。&lt;/p&gt;
&lt;p&gt;现场设立砼快速测强点，由试验员负责操作，为拆模提供依据。&lt;/p&gt;
&lt;p&gt;经纬仪、水准仪、台秤等计量工具由项目技改计量工长负责按规定送法检验单位检校。&lt;/p&gt;
&lt;h3&gt;9. 施工保证措施&lt;/h3&gt;
&lt;p&gt;坚持按程序合理组织施工，做到紧张有序，忙而不乱。上道工序未检查合格，不得作下道工序。&lt;/p&gt;
&lt;p&gt;坚持&amp;quot;三检&amp;quot;制度，实行优质优价，奖罚分明，对不合格工程，坚决推倒重做。&lt;/p&gt;
&lt;p&gt;钢筋接头，绑扎必须符合规范，对焊、竖向钢筋电渣压力焊水平钢筋窄间焊应先作试焊，经检验合格后，才能成批焊接。焊工必须持证上岗。&lt;/p&gt;
&lt;p&gt;模板支撑系统必须有足够的强度、刚度和稳定性，以保证建筑物的几何尺寸。&lt;/p&gt;
&lt;p&gt;实行砼浇灌证制度，在砼浇灌前必须认真检查。&lt;/p&gt;
&lt;p&gt;轴线、模板标高、断面尺寸是否符合设计要求，梁是否起拱正确，是否办理钢筋及预埋件的隐蔽验收资料签证；按计划规定设置的锚固螺、预留孔以及下道工序部配件是否正确；模板、钢筋的垃圾、油污是否清除干净；砼准备工作是否完毕；天气预报情况、砼运输道路是否畅通等。&lt;/p&gt;
&lt;p&gt;经各施工工长、质量检查员、安装负责人、现场代表签字后，方能进行砼浇灌。&lt;/p&gt;
&lt;p&gt;砼浇灌前必须用压缩空气将渣子吹净，并将模板充分湿润。&lt;/p&gt;
&lt;p&gt;在浇筑墙砼前，先浇5-10cm厚和砼内同标号的水泥砂浆，防止烂根。&lt;/p&gt;
&lt;p&gt;砼的振捣应密实，不得出现欠振、漏振和超振，防止出与蜂窝麻面。&lt;/p&gt;
&lt;p&gt;各装饰装修保证措施详见相关内容。&lt;/p&gt;
&lt;h1&gt;第11章 保证质量技术组织措施&lt;/h1&gt;
&lt;h2&gt;第1节 施工质量把关措施&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;严格按照国际标准质量管理体系的要求组织施工， 把&amp;quot;质量第一&amp;quot;的方针全面落实到一系列经营管理于生产经营活动之中。认真贯彻&amp;quot;谁施工，谁负责工程质量&amp;quot;的原则，切实做好 &amp;quot;自检、互检、交接检&amp;quot;工作，确保各分部分项工程均达到质量标准。严格行建设部《施工规范》、《质量验评标准、规范》以及新规范等（项目管理规范）确保工程质量目标的实施。同时，严抓质量，每周召开一次施工技术会议，提高管理水平，增强工作责任心，对工程质量严格按图纸施工，不准违反操作规程。&lt;/li&gt;
&lt;li&gt;《质量保证体系》及工程质保体系的要素职能分配表在工程实施施工时提供。&lt;/li&gt;
&lt;li&gt;工程质量控制点设立见附表a-c.&lt;/li&gt;
&lt;li&gt;建材质量控制措施：严格贯彻执行材料管理规章制度。所有原材料、成品、半成品进入现场，必须是有资质的检测部门核定的合格产品，必须有产品出厂合格证，并经建设方、监理同意之后，现场的质量检查员、材料员签字方可入库和进入现场堆放。水泥必须分期、分批、作安定性试验，钢材必须做力学性能试验；现场使用的砂、石子必须过筛，砌块必须浇水湿润，不合格的材料禁止使用。工程中使用的设备、器具、暖卫材料，其品种、规格、技术性能，均应符合国家现行标准与工程的设计要求。凡用于工程安装的材料及设备，必须符合国标、部标的有关规定，具有材质证明书、出厂合格证、使用说明书等才可使用。&lt;/li&gt;
&lt;li&gt;按不同工种作业的各小组，挂牌工，责任落实到人，严管重罚，杜绝违章操作，禁止偷工减料现象的发生，达到工完场清。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第2节 施工现场监督检查&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在项目负责人的领导下，负责检查监督施工组织设计的质量保证措施的实施，组织建立各级质量监督体系。严格监督进场材料质量、型号和规格、监督班组操作是否符合规范标准。&lt;/li&gt;
&lt;li&gt;按照规范规定的分部分项工程检验方法和验收评定标准，正确进行&amp;quot;自检、互检、交接检&amp;quot;实测实量，填报各项检查表格，对不符合工程质量要求的分部分项工程，提出返工意见。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第3节 技术保证措施&lt;/h2&gt;
&lt;p&gt;11.3.1现场成立技术、质量管理小组，并建立以项目经理、项目项目技术负责人为首的质量保证体系，推行目标管理(工程达到承诺标准)，并开展全面质量管理活动。&lt;/p&gt;
&lt;p&gt;11.3.2严格执行各项技术管理制度各级岗位责任制，严格按照施工图、技术规范、规程和工艺标准施工，并贯彻&amp;quot;三级&amp;quot;技术交底制。对工程中使用的新材料、新工艺、新技术须经过批准、试验并经鉴定后方可采用。&lt;/p&gt;
&lt;p&gt;11.3.3严格执行建设部颁发的质量检验评定标准，对进场原材料成品、半成品必须执行检验和验收制，不符合要求的原材料、成品和半成品严禁使用到工程上去。&lt;/p&gt;
&lt;p&gt;11.3.4施工中加强技术指导与检查，各级质检员应认真执行&amp;quot;质量否决&amp;quot;监督权，加强质量监督，加强&amp;quot;三检制&amp;quot;、&amp;quot;挂牌上岗制&amp;quot;，上一工序不合格必须返工重做。&lt;/p&gt;
&lt;p&gt;11.3.5严格贯彻工程质量奖惩制度，加强工程质量管理。&lt;/p&gt;
&lt;h2&gt;第4节 主要质量管理措施&lt;/h2&gt;
&lt;p&gt;11.4.1施工管理人员要熟悉各种施工有关规范，并根据施工组织设计中各分项工程的施工工序、工艺流程、操作方法等有关规定、规程分步骤地同操作班组进行技术交底。&lt;/p&gt;
&lt;p&gt;11.4.2坚持&amp;quot;出手负责制&amp;quot;和&amp;quot;三工序&amp;quot;制度，即检查上工序保证本工序，服务下工序，做好工序质量的控制，搞好质量的现场跟踪检查和跟踪管理，并做好自检自查记录。&lt;/p&gt;
&lt;p&gt;11.4.3所有进场的工程用原材料和半成品构件，必须要有出厂合格证并按检测规范先作材质检验，合格后方能使用。&lt;/p&gt;
&lt;p&gt;11.4.4搞好现场的计量管理工作，所使用的机具设备和检测仪器，尤其是检测仪器，必须经计量部门校验后再使用。&lt;/p&gt;
&lt;p&gt;11.4.5采用新材料、新技术、新方法的分项工程，先进行试验和做样板、试验后总结经验，拟定操作规程再详细向操作组作技术交底。&lt;/p&gt;
&lt;p&gt;11.4.6操作过程中要经常检查并纠正偏差，特别是采用新材料、新技术、新方法的分项工程，或者对质量、安全影响重大的分项工程要严格检查。务使各道工序按施工组织设计和有关规范、规程和要求操作。&lt;/p&gt;
&lt;p&gt;11.4.7搞好各分项工程的隐蔽工程验收，并作好记录，各层各段的分项工程、屋面工程、装饰工程等的质量检查验收。&lt;/p&gt;
&lt;h2&gt;第5节 主要分部分项工程的施工质量预控措施&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;基础土方工程：施工过程中，主要作好坑底的排水疏导，搞好降水工作，防止边坡失稳塌方而影响基础施工质量。对于基底土要重点采取以下措施：基坑施工前要及时做好临时排水，避免基槽浸水，基坑施工完毕，要及时施工基础，并及时回填夯实，施工的顺序上采取先室外道路、排水设施等工程。&lt;/li&gt;
&lt;li&gt;土方回填：土方回填过程中，首先通过试验确定最佳含水率，然后在回填过程中，按此含水率控制回填土质量，回填按每300mm厚一层，分层夯实，采用机械夯实，土方回填后，采用环刀法取样，以测定土的密实度，要大于94%以上。&lt;/li&gt;
&lt;li&gt;模板工程：严格按施工组织设计的方案支模，如施工组织设计中有对拉螺杆的不得漏设，模板支撑好后，应在砼施工前认真检查其安装部位，预留、预埋的位置是否正确，几何尺寸、标高是否正确，模板刚度、支撑点、支撑系统是否牢固，必要时必须通过计算，且其偏差值不得超过规范允许值，否则应重新校正直到满足要求后才能进行砼施工。&lt;/li&gt;
&lt;li&gt;拆模前，应先进行砼试块试压，当其砼实际强度满足规范规定的允许拆模强度时，并有项目经理的拆模令，才能进行拆模，拆下的模板应认真清洗、整理、打油，按规定的位置放好。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;模板工程的控制要点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;构件中心线、标高。&lt;/li&gt;
&lt;li&gt;模板的安装质量，包括刚度、强度和稳定性。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模板的平整度、垂直度、截面尺寸、标高、接缝严密情况以及预埋件、预留洞的位置。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;钢筋工程
&lt;ol&gt;
&lt;li&gt;认真熟悉施工图纸，弄懂每一个构件或结构部件钢筋布置形式、规格、间距和数量，以及各种规格钢筋绑扎的先后顺序，必要时并放施工大样。确定无误后再开始钢筋的制作及绑扎，钢筋下料制作后要按不同规格型号挂牌放置。&lt;/li&gt;
&lt;li&gt;钢筋焊接时，焊工应持证上岗，所使用的焊条应与钢筋同号，不得受潮，焊接前应先做焊件试验，合格后方可批焊接，焊接施工过程中，其接头处不得受潮或淋雨，对焊接的成品钢筋，应按楼层、按部位、按检测规范有关规定作随机抽样检验，其检验结果应符合设计及规范要求。&lt;/li&gt;
&lt;li&gt;钢筋绑扎好后，应先对照图纸认真检查，主要检查其部位规格、数量、间距、钢筋弯点、截断点、锚固长度、焊接长度、接头留设位置等是否正确，并做好自检自查记录，支模前，应做好隐蔽工程验收，并检查其相应的保证资料是否完整，均符合设计及规范要求后才能进行下一道工序的施工。&lt;/li&gt;
&lt;li&gt;钢筋工程质量控制的要点
a. 钢筋的品种和质量。
b. 钢筋的规格、形状、尺寸、数量、间距。
c. 钢筋的锚固长度、搭接长度、接头位置、弯钩朝向。
d. 焊接质量。
e. 预留洞孔及预埋件规格、数量、尺寸、位置。
f. 钢筋保护层厚度及绑扎质量。
g. 严禁踩踏和污染成品，浇砼时设专人看护和修整钢筋。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;砼工程
&lt;ol&gt;
&lt;li&gt;砼级配应先根据原材料检验的结果，按设计规定的强度标准做试配，达到设计规定强度值时，再由公司试验站设计级配单，具体施工时还要根据现场砂石的实际含水量适当调整水量。&lt;/li&gt;
&lt;li&gt;水泥除按要求作原材料检验外，在现场应按出厂编号、强度等级分别堆放，应有防潮隔潮措施，堆放时间不得超过三个月（快硬水泥不得超过一个月），否则应重新检验后降低标号使用，堆放时间超过六个月则不得使用。&lt;/li&gt;
&lt;li&gt;搅拌站搅拌砼时，派人到其站内巡视，严格按混凝土的计量要求，对各种原材料进行计量，搅拌时间要控制好（一般在90-120s内）。砼出料时应在现场进行坍落度试验，所做坍落度试验应符合砼配合比试验的要求，否则应适当调整用水泥和外加剂用量。砼入模时间应控制在半小时以内，砼在入模下料时，每次厚度不得超过振动棒头的长度，下料高度不得超过2m，下料应均匀。砼在振捣过程中，应采用矩阵式或梅花式布点振捣，振动半径其间距一般为0.5m。砼振捣时，振捣棒头应垂直插入砼体内，快插慢拔，振捣时间以砼体内不冒气泡且不明显往下沉为止。大型基础、主梁等不允许留施工缝的构件，砼应一次连续浇筑；其它砼结构接头的间歇时间不得超过砼的初凝时间（一般为2小时）。施工过程中，钢筋、模板应有专人看护，并按作业班次及砼立方量的比例，做好砼试块。&lt;/li&gt;
&lt;li&gt;砼浇筑12小时后，应进行养护。夏天，其养护时间为12-15天。&lt;/li&gt;
&lt;li&gt;砼浇筑后，当其强度达到1.2Mpa时，才能在其表面进行下道工序的施工。&lt;/li&gt;
&lt;li&gt;施工缝的处理：施工缝的处理，除按设计要求及施工方案规定的位置留设外，尚应按下列质量要求进行处理：下次作业一定要使前次砼强度达到1.2Mpa时，其接头钢筋表面的砼浮渣等应凿除，并认真清洗干净，提前24小时充分冲水湿润并铺垫10-20mm厚1:1水泥砂浆，然后再开始接头施工。&lt;/li&gt;
&lt;li&gt;由具有资质试验室设计掺有外加剂的砼级配单，搅拌时，按规定比例掺入外加剂，使砼的早期强度尽快增长。&lt;/li&gt;
&lt;li&gt;砼工程质量控制要点
a. 包括水泥的品种、标号和砂、外加剂的质量。
b. 搅拌时应重点控制配合比，原材料计量，坍落度。
c. 浇筑时应重点控制浇筑高度和振捣棒插入间距、深度、顺序。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第6节 砌体工程&lt;/h2&gt;
&lt;p&gt;11.6.1砌体施工中要层层挂线，及时吊靠，如有偏差，及时调整，砌体砂浆要饱满，其饱满度不小于80%，砌体上下错缝做到墙面清洁美观，水平灰缝饱满顺直，无边缝。&lt;/p&gt;
&lt;p&gt;11.6.2砌体应尽量少留接搓，需留设时砌筑时预埋拉结筋，位置及数量应满足规范要求，接搓处砂浆密实，无明显接搓痕迹。&lt;/p&gt;
&lt;p&gt;墙体砌筑的各种材料要符合设计要求。&lt;/p&gt;
&lt;p&gt;墙体采用的加气砼砌块在砌筑前要提前1---2天浇水湿润，确保空心砖和加气砼砌块的含水率分别为10---15％和5---8％。&lt;/p&gt;
&lt;p&gt;基层表面浇捣100mm的Ｃ15以上的细石砼找平后才可砌筑。&lt;/p&gt;
&lt;p&gt;在梁、板下口应用标砖斜砌挤紧，斜度为60度，砂浆应饱满。&lt;/p&gt;
&lt;p&gt;框架维护墙和内隔墙，墙高大于4.0m时，在窗顶或墙中每隔3m设置构造圈梁。严格按图纸要求设置构造柱。&lt;/p&gt;
&lt;p&gt;墙体与柱沿墙体高度每500mm设置2Ф6.5墙体拉结筋。加气砼墙每隔1000mm高度设置通长拉结筋分别锚入砌体砂浆中。构造柱浇筑砼时要清理干净砖面和柱底的落灰、碎石、木屑等杂物。&lt;/p&gt;
&lt;h2&gt;第7节 楼、地面工程&lt;/h2&gt;
&lt;p&gt;11.7.1施工前的楼地面基层要清扫、冲洗干净，检查基层平整及标高，并对操作人员进行详细的书面交底。施工时，严格执行操作规程，质检员要跟踪监督。&lt;/p&gt;
&lt;p&gt;11.7.2水泥砂浆楼地面和砼地面，不能出现积水，面层上不能有抹子印，在初凝前分两次压光，终凝后保温养护，防止起砂、空鼓。&lt;/p&gt;
&lt;h2&gt;第8节 内装饰工程&lt;/h2&gt;
&lt;p&gt;11.8.1内墙面，顶棚装饰施工前，首先应作样板间，当样板间经当地质监站、甲方会同检验认可后，其余房间再按此样板间组织有序的施工。&lt;/p&gt;
&lt;p&gt;11.8.2内墙面，顶棚装饰施工前，首先应吊线，坍饼冲筋，以保证抹后墙面的垂直度和平整度，顶棚抹灰前应弹水平线，墙面阳角处应用1:2水泥砂浆做2m高护角，阴阳角外，应用阴阳角尺搓顺。抹灰前，均应洒水湿润，抹灰时，应严格按操作规程分层抹灰，每层厚度不得超过规定允许值（由专职质检员现场交底）。&lt;/p&gt;
&lt;p&gt;11.8.3瓷砖墙面空鼓、脱落防治措施&lt;/p&gt;
&lt;p&gt;基层清理干净，表面修补平整，墙面洒水湿透。&lt;/p&gt;
&lt;p&gt;瓷砖使用前，须清洗干净，用水浸泡到瓷砖不冒气泡为止且不少2小时，然后取出，待表面晾干后方可粘贴。&lt;/p&gt;
&lt;p&gt;粘贴砂浆厚度应控制在7---10mm之间，过厚或过薄均易产生空鼓。当瓷砖墙面有空鼓和脱落时，应取下瓷砖铲去原有粘贴砂浆采用801胶聚物水泥砂浆粘贴修补。&lt;/p&gt;
&lt;h2&gt;第9节 油漆&lt;/h2&gt;
&lt;p&gt;不得不刷纹漏底流坠等现象，色泽均匀，施工过程中应跟踪检查。&lt;/p&gt;
&lt;h2&gt;第10节 外装饰工程&lt;/h2&gt;
&lt;p&gt;11.10.1基层处理，外墙面抹灰前，应先将脚手架眼，穿墙螺栓孔用细石砼坍饼，然后糙面抹灰，使抹灰面平整。&lt;/p&gt;
&lt;p&gt;11.10.2外墙面装饰线条施工，应先验算好尺寸，弹线分格扯通线后，按通线从上往下拉线，拉线时灰浆应饱满，水灰比适度，缝要钩好，缝宽一致顺直，并及时将表面擦干净。&lt;/p&gt;
&lt;p&gt;11.10.3内墙涂料施工前，先做好基层处理，表面清理干净后，用水泥浆满刮封底，再按样板确定的涂料，分层，自上而下按底涂、中涂、面涂组织专业队伍施工。&lt;/p&gt;
&lt;p&gt;11.10.4挑出的檐口板应按要求粉好滴水线（厚度要达到10mm，宽30mm）。&lt;/p&gt;
&lt;p&gt;11.10.5装饰工程的质量控制要点&lt;/p&gt;
&lt;p&gt;审查图纸，根据工程特点和现场具体条件制定施工方案，施工方案中应包括工期、施工顺序和施工方法。&lt;/p&gt;
&lt;p&gt;做好材料的试验、检验和试配工作。&lt;/p&gt;
&lt;p&gt;做好装饰节点的大样设计，做好装饰样板间、样板块，经甲方、监理等有关部门验收合格后方能大量施工。&lt;/p&gt;
&lt;p&gt;加强施工过程的检查，对违反操作规程和达不到标准的予以及时纠正。&lt;/p&gt;
&lt;p&gt;装饰各分部完成后应加强成品保护，避免损坏。&lt;/p&gt;
&lt;h2&gt;第11节 工程防水&lt;/h2&gt;
&lt;p&gt;屋面工程施工前，进行图纸会审，掌握施工图的细部构造及有关技术要求，编制好作业指导书。&lt;/p&gt;
&lt;p&gt;向班组进行技术交底，包括施工部位、施工顺序、施工工艺、构造层次、节点设防方法、工程质量标准、成品保护措施及安全等。&lt;/p&gt;
&lt;p&gt;所有材料都应有材料质量证明文件并经指定的质量检测部门认证，确保其质量符合技术要求，进场材料按规定取样复试。&lt;/p&gt;
&lt;p&gt;找平层首先符合排水坡度和顺向，找平层达到规定干燥后才能铺贴卷材防水层。在低温下不宜施工并应避免高温烈日下施工。&lt;/p&gt;
&lt;p&gt;在屋面拐角、天沟、水落口、屋脊、卷材搭接收头等节点部位，必须仔细铺平贴牢、压实、收头牢靠，符合设计要求和屋面工程技术规范等有关规定。&lt;/p&gt;
&lt;p&gt;11.11.1屋面找平层应养护干透以后才进行防水层施工.&lt;/p&gt;
&lt;p&gt;11.11.2保温层施工时,应按分格设排气道和排气孔。&lt;/p&gt;
&lt;p&gt;11.11.3防水材料铺贴时，应排尽空气，粘贴牢固，保证其搭接长度，且应注意卷材的铺贴方向（施工时，底层应平行排水坡铺贴，上层垂直排水坡向铺贴）。卷材接头应嵌入女儿墙内并粉好鹰嘴线。找平层应作好分仓缝，缝内满嵌防水油膏。&lt;/p&gt;
&lt;p&gt;11.11.4外墙渗水防止措施&lt;/p&gt;
&lt;p&gt;保证砌体砂浆饱满度是防止外墙渗水的重要措施，砌体组砌应严格按照施工规范和操作规范要求。&lt;/p&gt;
&lt;p&gt;外墙宜搭设双排脚手架，尽量减少脚手架眼。外墙粉刷前就应先清除施工孔洞内残浆杂物，浇水湿润然后用相同标号的砂浆和砖砌筑严密。&lt;/p&gt;
&lt;p&gt;框架梁下的填充墙，最上一皮砖应斜砌与梁底顶紧，砌筑严密。&lt;/p&gt;
&lt;p&gt;1：3水泥砂浆打底必须两次成活。&lt;/p&gt;
&lt;p&gt;11.11.5窗渗漏防治措施&lt;/p&gt;
&lt;p&gt;横向与竖向构件组合时，须采用套插方式，套插尺寸不得小于10mm并用密封胶密封。&lt;/p&gt;
&lt;p&gt;外密封条是隔气、防水的重要部位，安装时应特别注意，密封条抗老化性能应优良，规格合适，其嵌固在窗扇上应牢靠，在转角处应切成45度角并硅胶粘结牢固，不得有缝隙，门窗关闭后其密封条必须全部处于受压状态。室外玻璃压条与玻璃间填嵌密封胶必须饱满，粘结牢固，以防从此处渗水。&lt;/p&gt;
&lt;p&gt;框上冒头应开泄水槽，相应部位的密封条亦应开槽。&lt;/p&gt;
&lt;p&gt;门窗洞外侧靠框边处应留槽，填嵌密封材料时槽口基层必须干燥并清理干净，密封胶表面不得有缝隙，气孔等。&lt;/p&gt;
&lt;p&gt;为防止水从窗框周边，砂浆微小缝隙渗透，可采用成膜性防水材料堵塞其中毛细孔。&lt;/p&gt;
&lt;p&gt;11.11.6卫生间漏水防治措施&lt;/p&gt;
&lt;p&gt;卫生间在铺设找平层前应检查地漏标高并对立管、套管和地漏穿过楼板处的节点间采用细石砼将四周稳牢堵严，进行密封处理，在管四周留出深8---10mm沟槽，采用防水类涂料裹住管口和地漏。找平层与墙面的交接阴角处做成小圆角。&lt;/p&gt;
&lt;p&gt;在找平层上铺涂防水涂料时，找平层应清洁干燥，含水率不大于9%，并先涂刷基层处理剂。&lt;/p&gt;
&lt;p&gt;铺涂防水材料时，在穿过楼板在管道四周处的防水涂料应向上铺涂，并应超过套管的上口，靠近墙面处防水涂料向上铺涂，高出面层20-30mm，阴阳角和穿过楼板面管道的跟部应增加铺涂防水材料。&lt;/p&gt;
&lt;p&gt;铺涂完毕后应做蓄水实验，蓄水深度为20-30mm，24小时内无渗漏为合格，并作好记录。&lt;/p&gt;
&lt;p&gt;实验合格后应立即做好防水涂料的砂浆保护层，防止防水涂料的损坏。&lt;/p&gt;
&lt;h2&gt;第12节 轴线标高垂直度的控制&lt;/h2&gt;
&lt;p&gt;11.12.1所使用的测量仪器、卷尺，必须通过市计量局校验后投入使用。工地设专人负责保管。&lt;/p&gt;
&lt;h2&gt;第13节 质量奖罚措施&lt;/h2&gt;
&lt;p&gt;11.13.1对本工程全体队组，项目班子执行责任制，在质量管理上，执行管理效益工资，并执行奖罚制度。&lt;/p&gt;
&lt;p&gt;11.13.2 项目管理人员执行末位淘汰制，每季度考核一次，对不能达标者予以调岗，并作待岗处理，对达不到优良工程的项目经理，则予以解聘。&lt;/p&gt;
&lt;h1&gt;第12章 保证工期技术组织措施&lt;/h1&gt;
&lt;h2&gt;第1节 建立严格的施工进度计划检查制度&lt;/h2&gt;
&lt;p&gt;施工中严格按照网络计划来控制施工进度与各工种的插入时间，施工管理人员根据总进度计划制定详细的月、旬作业计划，合理安排工序搭接和施工流向。为防止进度落后，项目部每日检查当日的施工进度情况，做到当时进度当时完成，今天不影响明天，上道工序不影响下道工序，对影响进度的关键部位，项目经理亲自指挥。如遇特殊原因或不可抗拒因素延误某项工序的进度，项目部将千方百计抢时间、充分调动各级施工人员的积极性和一切施工力量，在最短的时间内将进度抢上来。&lt;/p&gt;
&lt;h2&gt;第2节 保证材料及外加工构件的供应&lt;/h2&gt;
&lt;p&gt;开工前组织有关人员做好分部分项工程工料分析表，根据施工图预算提出材料、成品、半成品加工订货及供应计划。做好施工机械的落实以及材料的采供工作。根据《施工进度计划网络图》确定材料进场时间。&lt;/p&gt;
&lt;h2&gt;第3节 土建与安装的配合协调工作&lt;/h2&gt;
&lt;p&gt;在施工中，双方要相互创造条件，合理穿插作业，同时均要注意保护对方的成品和半成品。在项目经理统一安排下，每周召开一次现场协调会，积极主动解决好各工种之间的配合等方面的问题。选派有多年施工经验，善打硬仗的施工队伍，集中施工力量，充实组织管理机构。按施工进度计划网络图，合理安排劳动力及材料供应工作，提高施工效率。根据工程结构特点，分出主次部位，按照施工顺序、施工工艺进行立体交叉作业，以确保工程按期完成。&lt;/p&gt;
&lt;h2&gt;第4节 实行资金专款专用&lt;/h2&gt;
&lt;p&gt;项目部资金实行专款专用的管理办法，实行&amp;quot;一支笔审批制&amp;quot;，工程资金一律由项目经理批准后方可动用，确保本工程资金专款专用。&lt;/p&gt;
&lt;h1&gt;第13章 安全施工技术组织措施&lt;/h1&gt;
&lt;h2&gt;第1节 安全保障的部署&lt;/h2&gt;
&lt;p&gt;本公司实行公司、项目经理部、施工队组三级管理模式，各级分别由行政一把手任安全责任人，并按项目部设立&amp;quot;安全生产管理小组&amp;quot;，定期研究、协调、计划、布置、检查安全生产工作。&lt;/p&gt;
&lt;h2&gt;第2节 项目经理部体系构成&lt;/h2&gt;
&lt;p&gt;由项目经理任项目安全生产负责人，由项目安全员负责日常安全生产的布置、计划、协调、检查、指导，并协助公司技术安全部门，做好工地安全生产的宣传、教育和专业培训，实施公司具体的安全管理工作。项目经理部下属各施工队组则分别设立专职或兼职安全员，负责各自管理范围内的专业性的安全管理工作。&lt;/p&gt;
&lt;h2&gt;第3节 安全管理体系&lt;/h2&gt;
&lt;p&gt;见相关附件。&lt;/p&gt;
&lt;h2&gt;第4节 项目责任目标&lt;/h2&gt;
&lt;p&gt;12.4.1施工现场要执行标准化，安全文明施工达到JGJ59-99《建筑施工安全检查标准》，并达到承诺的安全目标。负伤频率小于3‰，杜绝重大伤亡及责任事故。&lt;/p&gt;
&lt;h2&gt;第5节 安全生产管理&lt;/h2&gt;
&lt;p&gt;13.5.1公司主管安全的经理、技术科、安全科、安全员、项目经理、项目技术负责人、项目安全员、施工队组长、专业工长、各专职兼职安全员形成公司安全生产项目管理体系。&lt;/p&gt;
&lt;p&gt;13.5.2项目部及各施工队组严格执行国家有关安全生产的方针、政策、规范及有关标准，坚持安全生产&amp;quot;五同时&amp;quot;，即同时设计、同时施工、同时检查、同时总结、同时评比。&lt;/p&gt;
&lt;p&gt;13.5.3坚持经常性安全教育和安全技术培训，工地每周四下午为安全技术业务学习日。&lt;/p&gt;
&lt;p&gt;13.5.4切实抓好公司、项目部、施工队组三级安全教育和班前安全技术交底，各专业工种必须执证上岗。&lt;/p&gt;
&lt;p&gt;13.5.5工地必须使用好安全生产&amp;quot;三宝&amp;quot;（安全帽、安全带、安全网），对脚手架、脚手板、井架、砼搅拌机等必须严格办理验收手续，严禁各种违章作业。&lt;/p&gt;
&lt;p&gt;13.5.6项目部电工要保证用电安全，经常检查及维修电路、设备、安装好漏电保护装置，严格执行单机单闸和用电设备的漏电保护制度。&lt;/p&gt;
&lt;p&gt;13.5.7严格执行国家有关规定、标准，执行施工现场&amp;quot;十不准&amp;quot;。&lt;/p&gt;
&lt;p&gt;13.5.8公司、项目部定期或不定期对安全生产进行检查，提出整改意见，实施措施，督促、清除事故隐患。&lt;/p&gt;
&lt;p&gt;13.5.9凡出现伤亡事故，必须尽快逐级上报，切实做到&amp;quot;四不放过&amp;quot;。&lt;/p&gt;
&lt;p&gt;13.5.10坚持施工现场的安全检查制度，安全检查责任到人，限定时间整改并复查整改落实情况，做好记录，月检查按照部颁标准《建筑施工安全检查评分表》进行。&lt;/p&gt;
&lt;h2&gt;第6节 项目安全管理责任制&lt;/h2&gt;
&lt;p&gt;13.6.1项目经理是项目工程的第一责任人，亦是项目工程施工安全管理工作的第一责任人。项目经理应带头执行安全法律、法规和企业的安全生产管理制度，组织领导所承建的项目工程的安全生产管理工作；组织制订并完善适合本工程施工的各项安全生产措施、规章制度、奖惩办法。&lt;/p&gt;
&lt;p&gt;13.6.2项目经理部应设置专职（并取得资质的）安全员，在项目经理领导下，督促和检查工地安全生产，监察事故隐患，处理违章操作事件，贯彻执行安全法规和标准，实行安全生产一票否决权。&lt;/p&gt;
&lt;p&gt;13.6.3成立安全生产领导小组，项目经理担任组长，项目经理部生产、技术方面的管理人员为成员；安全员具体监督，资料员做好安全资料的收集与整理、送检和归档。&lt;/p&gt;
&lt;p&gt;13.6.4项目经理部在制订管理目标时，明确安全生产和文明施工的管理目标，在工程施工的全过程中，要实行跟踪监控、加强管理、保证其目标的实现。&lt;/p&gt;
&lt;p&gt;13.6.5项目经理部和安全生产领导小组，根据安全管理目标，将其指标分解并纳入到各个管理工作岗位责任人和各施工队的经济技术承包合同中，制订考核标准，建立考评制度，实行奖优罚劣兑现；即将其安全管理目标落实到每一个人和施工作业队组。&lt;/p&gt;
&lt;h2&gt;第7节 安全保证主要措施&lt;/h2&gt;
&lt;p&gt;13.7.1进入本项目工程施工的所有工作，所有外来施工人员按照行业管理要求办清注册登记及其相关的手续。操作人员必须进行&amp;quot;三级安全教育&amp;quot;。&lt;/p&gt;
&lt;p&gt;13.7.2特种岗位作业人员和高处作业人员，除满足上一条要求外，还应进行身体检查，合格者并持有本岗位有效的操作证件，方可上岗和登高作业。&lt;/p&gt;
&lt;p&gt;13.7.3所有施工队及个人，上岗前应与项目经理部签订安全生产合同书，明确其各自的权益和责任范围。&lt;/p&gt;
&lt;p&gt;13.7.4所有施工队组及个人，在进行每一道施工工序、每个分项工程施工之前，特别是重要部位和危险性岗位，都要进行安全教育和施工安全技术交底，并形成文字资料，由交底人和被交底人分别在施工安全技术交底资料签字。&lt;/p&gt;
&lt;p&gt;13.7.5施工队组，要坚持班前活动制度，即总结前一天施工中的安全生产情况，结合当天的施工任务工作特点，由队组长（或施工员）有针对性地提出注意事项和防范办法；项目经理部实行定期或不定期的安全活动日制度，日常工作要做到&amp;quot;五同时&amp;quot;。&lt;/p&gt;
&lt;h2&gt;第8节 现场管理措施&lt;/h2&gt;
&lt;p&gt;13.8.1项目经理部要按照封闭施工的要求，搭设围墙和门房，制订门卫制度，实行封闭式的管理。与项目工程施工无关的人员非经允许不得入内，上级主管部门及相关的单位、部门来工地执行公务人员经门卫同意且戴好安全帽后，方可进入施工现场。项目经理部全体工作人员、现场所有的施工人员均必须自觉地戴好安全帽后，方可进入施工现场，方可进入操作岗位。&lt;/p&gt;
&lt;p&gt;13.8.2施工操作工作中，不允许穿高跟鞋、不允许打赤脚、穿拖鞋和不能满足安全生产要求的服装。高处危险作业（如架工、木工、钢筋工等）不允许穿硬底鞋、拖鞋。不安排女工上高处危险作业。&lt;/p&gt;
&lt;p&gt;13.8.3施工现场的办公区与生产区域应分离，职工家属、特别是小孩不得进入施工现场。&lt;/p&gt;
&lt;p&gt;13.8.4施工现场的平面布置，应按照施工组织设计进行布置。施工用电的线路、施工道路、临时设施、易燃易爆物品的布放等均应满足有关安全的要求。&lt;/p&gt;
&lt;h2&gt;第9节 施工用电&lt;/h2&gt;
&lt;p&gt;13.9.1根据本项工程的特点，拟设专职电工两名，全权负责本项工程施工用电的线路架设和安拆、电器保管、维修和使用。&lt;/p&gt;
&lt;p&gt;13.9.2根据建设方提供的电源，搭设配电房一间（约9m^2^），并配置配电柜一台，安装门锁，由专业电工负责操作。&lt;/p&gt;
&lt;p&gt;13.9.3根据施工组织设计和现场施工机械设备的布置及施工照明（含生活用电）的需要，实行单机单闸安装电闸箱；施工照明采用可移动&amp;quot;三相五线制&amp;quot;的活动闸箱；移动式手持小型电动工具采用三相插头接电。所有电闸箱按标准制作、安装闸刀，电闸箱应防雨，装门安锁。&lt;/p&gt;
&lt;p&gt;13.9.4所有机械设备应埋设接地，井架等高耸机械设备还应安装避雷装置，并按标准做好检测。&lt;/p&gt;
&lt;p&gt;13.9.5配电室及各施工机械的配置专用电闸箱，均应配置安装漏电保护器。各种保险丝的规格均应与所对应的机械设备的功率相匹配，不得用过大的保险，不得用铜丝、铝丝和铁丝代用。&lt;/p&gt;
&lt;h2&gt;第10节 施工机械&lt;/h2&gt;
&lt;p&gt;13.10.1进入施工现场的机械设备的完好率应是百分之百，做好运转记录，加强维修保养，不得带&amp;quot;病&amp;quot;作业，不得违章操作。每个台班使用前均应进行试运转，试运转结果符合要求后，方可正式投入使用。&lt;/p&gt;
&lt;p&gt;13.10.2垂直运输设备安装完后，应办理验收或分段验收签证手续，办清验收合格手续后，方可正式投入使用。井架的卷场机应搭设安全操作棚，卷场机的转动部位、刹车、钢丝绳、锚桩、缆风绳等应定期检查。&lt;/p&gt;
&lt;p&gt;13.10.3凡属升降性的机械设备（如塔吊、人货电梯、砼搅拌机等）均应安装限位（超高）和保险（防断）装置，严禁钢丝绳拖地、地面卷扬机钢筋绳要设置沟槽加以保护。吊篮入口处应装安全门，各停吊处应设保险（杠）装置，下班前应拉闸断电。&lt;/p&gt;
&lt;p&gt;13.10.4所有机械设备的转动部位（如皮带、齿轮等）应设防护罩，不同机械相应设置不同的防护板（罩）。凡有正反转的机械设备，除要求单机单闸外，电闸箱距操作者的距离不宜太远（一般为3－5.0m），采用继电器按纽开关或倒顺开关操作。&lt;/p&gt;
&lt;p&gt;13.10.5砼搅拌机等公用机械设备和操作者均应持有有效操作证上岗，其他专业工种的机械设备（如钢筋机械、木工机械、砂浆搅拌机等）实行定人定岗持证操作，操作前要进行安全技术交底，学习操作规程，掌握操作要领；潜水泵等带水作业机械，蛙式打夯机、电焊机等操作者还要穿绝缘鞋、戴绝缘手套等防护用品。&lt;/p&gt;
&lt;h2&gt;第11节 模板工程&lt;/h2&gt;
&lt;p&gt;模板工程所用各种材料的材质，必须符合要求，工程模板制作与安装，质量与安全应同时验收，两项同时达到合格后方可进入下道工序。所有支撑系统和现浇梁板的底模，其强度、刚度和稳定性均要满足要求。支撑系统与脚手架（运输道）要脱开，不得连体。砼入模要均匀分散，施工人员不得集中。砼浇筑过程中，安排专人监护，确保模板工程质量和安全施工。&lt;/p&gt;
&lt;p&gt;模板拆除前，由工程技术人员进行交底，安排其拆除时间、部位和要求，重要构件应有砼试块试压报告，在满足施工规范和施工安全之要求后方可拆除。拆模过程中，操作者应遵循&amp;quot;安全第一、质量第二&amp;quot;的原则。&lt;/p&gt;
&lt;h2&gt;第12节 安全防护&lt;/h2&gt;
&lt;p&gt;13.12.1进入施工现场必须戴安全帽,主要出入口和操作场所必须搭设安全通道和安全操作棚，高处作业和危险部位操作必须系安全带，穿防滑鞋。&lt;/p&gt;
&lt;p&gt;13.12.2本工程采用全封闭施工。井架体外围三面脚手架全封闭，一般建筑物的施工作业层应全封闭，其封闭材料和安全网均要符合JGJ59－99标准的要求。&lt;/p&gt;
&lt;p&gt;13.12.3所有&amp;quot;四口&amp;quot;都要采取切实可行有效的防护措施。屋面、檐口、梯口、施工洞口、卸料平台等施工临边均应采取严格的防护。&lt;/p&gt;
&lt;p&gt;13.12.4所有危险区域、交通出入口都要设置警示标志、标牌、标语，现场重要位置应悬挂安全标牌，在各种施工机械附近，固定安全操作规程，告示施工人员注意安全。&lt;/p&gt;
&lt;p&gt;13.12.5雨季和冬季施工要做好防滑防护措施。搞好环境卫生、改善生活工作条件、保障工人身体健康、合理安排作息、注意劳逸结合，避免各种不安全的因素和隐患的发生。&lt;/p&gt;
&lt;h2&gt;第13节 安全施工培训及三级教育&lt;/h2&gt;
&lt;p&gt;13.13.1进入本项目工程施工的所有管理人员，所有外来施工人员要按照行业管理要求办清注册登记及其相关的手续。操作人员必须进行&amp;quot;三级&amp;quot;安全教育，并由个人签字。&lt;/p&gt;
&lt;p&gt;13.13.2特种岗位作业人员和高处作业人员，要持有本岗位有效的操作证件，方可上岗和登高作业。对于本工程中的特种作业要组织专业培训。&lt;/p&gt;
&lt;p&gt;13.14.3所有施工队组及个人，在进行每一道施工工序、每一个分项工程施工之前，特别是重要部位，都要进行班前安全教育和施工安全技术交底，并形成文字资料，由交底人和被交底人分别在施工安全技术交底资料签字。&lt;/p&gt;
&lt;h2&gt;第14节 脚手架防护&lt;/h2&gt;
&lt;p&gt;13.14.1所有架设工具的材质应符合国家颁发的标准要求，各种杆件间距应按要求搭设。按规定设置剪刀撑、抛杆、斜撑，按规定与主体结构进行拉结。操作层满铺跳板、设护拦和档脚板（杆），根据建筑物的高度，脚手架采用分段验收合格后，方可投入使用。使用期间，应设专人监护和维修。施工荷截不得超过2700N/m^2^。&lt;/p&gt;
&lt;p&gt;13.14.2脚手架应经技术部门检测鉴定合格后，方可投入使用。各种特殊脚手架的搭设与安装，须经安全技术部门联合验收后，方可投入使用。&lt;/p&gt;
&lt;p&gt;13.14.3室内简易脚手架的搭设，必须安全可靠，满足操作需要。各种脚手架的搭设与拆除，均应遵循操作规程之要求，做到安全操作，避免一切不应有的事故发生。&lt;/p&gt;
&lt;h2&gt;第15节 高空坠落防护&lt;/h2&gt;
&lt;p&gt;13.15.1脚手架采取安全网全封闭，操作层脚手板满铺，板端采用铁丝绑扎，每块跳板下为三根横档，操作层上的栏杆不小于1.20m，脚手架要由专业架子工进行，脚手架验收合格后，其他人员禁止随意拆除、改动脚手架。&lt;/p&gt;
&lt;p&gt;13.15.2凡属&amp;quot;五临边&amp;quot;、&amp;quot;四口&amp;quot;作业，必须要先交底后施工、先架子验收合格后再施工、先做好防护后方可施工，先检查落实了施工人员的安全防范措施（安全带、安全帽）后才准予施工。&lt;/p&gt;
&lt;p&gt;13.15.3高空作业人员要先查证、查自我安全防范意识、查三级专题安全教育落实后方可准许进行高空作业。&lt;/p&gt;
&lt;p&gt;13.15.4凡年令超过35岁的女工，禁止上脚手架从事高空作业。&lt;/p&gt;
&lt;p&gt;13.15.5定期组织专项安全大检查，检查重点为脚手架。&lt;/p&gt;
&lt;h2&gt;第16节 触电防护措施&lt;/h2&gt;
&lt;p&gt;13.16.1施工现场施工用电采用&amp;quot;三相五线&amp;quot;制，&amp;quot;TN-S&amp;quot;系统。供电系统采用&amp;quot;三级供电&amp;quot;、&amp;quot;两级保护&amp;quot;，每台设备设一个开关箱，并做到&amp;quot;一机一闸一漏一箱&amp;quot;，开关箱中的漏电保护器的额定动作电流不大于30mA，额定漏电动作时间应小于0.1s。设立专用电工房，安排二名电工轮流值班。&lt;/p&gt;
&lt;p&gt;13.16.2现场所有架空线要架设在专用电线杆上，高度不小于4.5m，道路上部的架线高度为6.0m，线间距离为0.3m，为了架设方便，本工程施工用电线架设在现场专设的杉木电线杆上。&lt;/p&gt;
&lt;p&gt;13.16.3做好设备的接地、或接零，对移动式的电器及设备，如电焊机、手持电动工具，要做专门保护接零，并设漏电保护器。&lt;/p&gt;
&lt;p&gt;13.16.4重点要检查各种接线头，保险、并关，防止产生漏电现象。&lt;/p&gt;
&lt;p&gt;13.16.5制止违章作业，非专业电工，禁止无证操作。&lt;/p&gt;
&lt;h2&gt;第17节 安全资料管理&lt;/h2&gt;
&lt;p&gt;项目经理部必须设置一名专职的安全资料员，也可由工程技术资料员承担。在项目经理领导下，全权负责完成安全资料的收集、编制、填写、整理、归档。&lt;/p&gt;
&lt;p&gt;按照JGJ59－99标准和企业的标准模式，紧随工程施工的进程逐步完善各段各项资料，要求做到及时、准确、齐全，避免事后补办。安全资料涉及到的部门和个人，都要积极配合资料员的工作，安全员要协助资料员做好资料的收集、整理。同时还要经常协助其资料收集与整理，配合完善资料。&lt;/p&gt;
&lt;p&gt;项目工程施工要自觉接受上级主管部门的安全检查，项目经理、各专业工长、施工队要虚心接受检查，及时整改隐患。项目工程施工中，项目经理部邀请市安监站到现场进行施工安全检查验收。一般不少于两次，主体工程施工每四层验收一次，主体工程完工后，装饰工程施工前必须进行一次验收。工程竣工后及时将安全资料送交市安监站审查，评定单位工程安全生产的等级。&lt;/p&gt;
&lt;h2&gt;第18节 制定安全奖罚制度&lt;/h2&gt;
&lt;p&gt;本工程安全生产目标为：&lt;/p&gt;
&lt;p&gt;杜绝死亡事故或四人以下轻伤责任事故，工程安全验收为安全优良工地，对此，制定工程的安全施工奖罚措施如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;工程竣工，验收达到优良级。公司对项目部奖励规定的数目；对项目经理个人奖励规定的数目；&lt;/li&gt;
&lt;li&gt;达不到优良级，公司对项目部罚款规定的数目，对项目经理个人罚款规定的数目；&lt;/li&gt;
&lt;li&gt;若发生重伤责任事故及以上的，则对项目经理部予以重罚，项目经理及项目经理部均处以双倍的罚款。严重者追究相关的法律责任。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;第14章 文明施工技术组织措施&lt;/h1&gt;
&lt;h2&gt;第1节 文明施工管理责任制&lt;/h2&gt;
&lt;p&gt;本工程建立起以项目经理为首的文明施工管理小组，项目经理为组长，项目副经理、项目技术负责人为副组长。&lt;/p&gt;
&lt;p&gt;要求项目部管理目标：创安全文明施工承诺目标。&lt;/p&gt;
&lt;h2&gt;第2节 现场标牌设计&lt;/h2&gt;
&lt;p&gt;本工程位于厂内，为此，按施工平面图所示，在正面入口大门设置标牌，标牌采用夹板制作，上设本工程施工标牌，安全标志等主要为&amp;quot;五牌一图&amp;quot;。其它设备、人货电梯、塔吊等处，分设专业标牌。标牌内容则按照目前国家、及省市有关规定执行。本工程在大门处设置门卫，白天、黑夜换班执勤，进行封闭管理。&lt;/p&gt;
&lt;h2&gt;第3节 材料及半成品堆放&lt;/h2&gt;
&lt;p&gt;材料及半成品堆放均按照施工平面布置图进行，砖块码堆，砂堆放，水泥入库，钢筋、模板分类，底部垫高架空，并设立材料标牌，登记入帐。&lt;/p&gt;
&lt;p&gt;本工程场地狭窄，故材料、半成品只有严格按材料计划进场，才能有效利用施工现场。&lt;/p&gt;
&lt;h2&gt;第4节 现场道路&lt;/h2&gt;
&lt;p&gt;进入施工现场的车辆，工地设专人指挥，同时，与厂内联系好施工车辆的进出时间、车次，尽量减少车辆进出对周边环境的影响。&lt;/p&gt;
&lt;p&gt;对进出场的本地车辆，还要由工地设专人负责，防止车辆进出轮胎带泥；为保证车辆在厂内行使安全，本项目部将针对现场特点与车辆所有者签订责任合同，明确要求遵守厂方各项管理制度，凡车况不良者不得承担本项目运输任务。&lt;/p&gt;
&lt;h2&gt;第5节 卫生管理&lt;/h2&gt;
&lt;p&gt;施工现场的生活区另择地安置，要求与施工现场分开。对现场堆放的材料，要规整，并设专人负责。生活区由专人负责卫生管理。食堂、茶水、洗浴室、厕所均列入卫生责任管理范围，民工宿舍作简易装修。&lt;/p&gt;
&lt;h2&gt;第6节 现场排水&lt;/h2&gt;
&lt;p&gt;现场施工道路的两侧、建筑物的外围，均应设置排水沟和截水沟；地面水和施工中（含生活）的污水，均应设置沉淀池；施工过程中，均应将雨水、地下水、施工污水经过沉淀池沉淀后，排出施工现场，确保施工现场和基坑（槽）内无积水。&lt;/p&gt;
&lt;h2&gt;第7节 文明施工教育&lt;/h2&gt;
&lt;p&gt;同安全三级教育相结合，本项目部由项目经理任第一责任人，项目施工负责人负责文明施工具体实施，具体内容按照《建筑施工安全检查标准》(JGJ59-99)执行。&lt;/p&gt;
&lt;h2&gt;第8节 机械布置、料具存放&lt;/h2&gt;
&lt;h3&gt;1. 机械布置&lt;/h3&gt;
&lt;p&gt;施工现场的各种机械设备均应按照审定批准的施工组织设计中《现场平面布置图》的要求进行布置；机械设备应经常保养清理，保持机体洁净。&lt;/p&gt;
&lt;h3&gt;2. 材料存放&lt;/h3&gt;
&lt;p&gt;施工现场所有建筑原材料、构配件、周转材料等均按照施工组织设计中《现场平面布置图》所规定或划分的地点和区域，分门别类、实行挂牌、整齐堆放，凡不符合要求的各种物资，一经检查验收不合格者，不得进场或立即清出现场；易燃易爆及危险品要按规定分类存放，加强管理。&lt;/p&gt;
&lt;h3&gt;3. 现场清理&lt;/h3&gt;
&lt;p&gt;施工现场要洁净，做到下班前清理现场，做到每一分项工程完工后，余料清理干净，各种建筑垃圾要及时进行清理和处理，按时清出现场。&lt;/p&gt;
&lt;h3&gt;4. 现场防火&lt;/h3&gt;
&lt;p&gt;根据工程特点，制订出针对性强的安全防火制度，划分责任区，落实责任人，由项目经理部专职安全员监督检查。&lt;/p&gt;
&lt;p&gt;工地应备有必要的消防器材，如砂袋、灭火器等。&lt;/p&gt;
&lt;p&gt;禁火地点或区域，需动火时，按规定办理动火手续，并做好防火措施。&lt;/p&gt;
&lt;h3&gt;5. 治安管理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;登记注册
工地所用外来劳动力，按程序办理各项登记手续，非本工程劳务人员一律不得住宿。&lt;/li&gt;
&lt;li&gt;门卫制度
工程所用各种物资进出场时均应检查验收，出场应有出场证，门卫检查把关，否则不得外出。&lt;/li&gt;
&lt;li&gt;治安保卫
要经常对职工进行职业道德教育，要相互帮助团结友爱，遵纪守法，对打架斗殴、盗窃财物、损坏公物的现象，按工地治安规定进行认真处理。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6. 宣传教育&lt;/h3&gt;
&lt;p&gt;结合工程施工实际情况，经常进行有针对性的安全生产、文明施工和职业道德的教育。&lt;/p&gt;
&lt;p&gt;施工中要结合工程施工各个部位、各施工阶段的特点，张贴安全宣传标语、悬挂安全生产标牌，警示施工人员注意安全、起到保驾安全的重要作用。&lt;/p&gt;
&lt;h3&gt;7. 社区服务&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;项目经理部要结合实际制订出少扰民的措施，合理安排施工工序，尽量少安排深夜夜班。&lt;/li&gt;
&lt;li&gt;减少污染
工程用白灰膏，由专车运送。砼配制应按石子→水泥→砂子先后顺序配料；不得在现场焚烧有害物资，尽量减少粉尘，避免污染。&lt;/li&gt;
&lt;li&gt;搞好与周边单位的协调关系，处理好现场施工道路，施工用电、用水；在现场建设方代表的协调下，共同努力，使工程尽快保质量、保进度的完成，为建设方提交一个满意的优质产品。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;文明施工管理是企业施工生产经营的综合反映，我们将把它贯穿于施工管理的全过程，并且争创&amp;quot;市标准化施工现场&amp;quot;。&lt;/p&gt;
&lt;h1&gt;第15章 成品保护&lt;/h1&gt;
&lt;p&gt;对于建筑产品，无论是在施工过程中还是在完工后，都应对工程成品、半成品采取保护措施，特别是对于施工过程中的工序产品，要制定严格的保护措施，防止工序产品受到污染、损坏，避免不必要的返工返修现象，从而稳步提高工程质量。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在总体施工安排上，要根据施工组织设计的总体要求，合理安排施工顺序，如基础结构施工必须待基坑排水措施落实后进行，防止雨水浸泡地基；水电管线预埋必须待板底筋绑扎后，板间筋绑扎前预埋到位，防止事后凿打砼；设备预留埋必须待设备到货核对无误后进行，防止到货设备实际尺寸与设计不符，造成返工；外装修从上至下施工；室内装修按照先顶棚再墙面，最后楼地面的顺序施工，防止装修期间造成交叉污染；屋面防水层施工应待所有管道设备安装固定后开始施工，以保证防水层不受损坏。&lt;/li&gt;
&lt;li&gt;在工序施工过程中特别是交叉作业施工的工序，应制定相应措施，既要保护好自身的产品质量，又保护好已完工的工序成品质量，还要保证对下一道工序能提供便利干净的工作面。
a. 框架柱、剪力墙钢筋绑扎完后，严禁施工人员从钢筋上攀爬，防止钢筋踩踏变形。
b. 楼梯钢筋绑扎后，应安排木工尽快支模，木工支模过程中严禁随意踩踏钢筋；楼梯休息平台钢筋绑扎完后，用带有撑脚的夹板覆盖避免将板面筋踩弯变形。
c. 楼板内水电预埋管线及预埋铁件固定时，严禁用楼板筋作为引弧试焊，防止烧伤楼板筋。&lt;/li&gt;
&lt;li&gt;对于浇灌成型的砼，首先要加强对砼的养护，对于楼面及楼梯砼，终凝前严禁上人、堆物。梁、板、柱拆模时间必须满足设计及施工规范要求，严禁随意拆模，否则，一经发现予以重罚。&lt;/li&gt;
&lt;li&gt;门窗安装保护措施
窗安装待外墙涂料施工完毕，窗洞口尺寸经水泥砂浆抹灰符合要求后进行，窗框安装前应用塑料膜将窗框包裹严密，防止墙面抹灰砂浆污染塑钢窗框。固定塑钢窗框铁件，如焊接，焊接时要保护好外墙，由于铁件应隐埋入砂浆层内，在墙面开槽时应用切割机切割，严禁乱凿乱打。待室内外墙面装修完工后再拆去窗框上的保护模。&lt;/li&gt;
&lt;li&gt;脚手架搭拆
外脚手架拆除时，在传递钢管等材料时要轻拿轻放，并派专人指挥，严禁损坏窗及玻璃。室内拆除脚手架时，应讲究文明施工，不得乱扔钢管、扣件，防止钢管、扣件等材料损坏已完工的墙面。&lt;/li&gt;
&lt;li&gt;油漆施工
油漆工涂刷油漆时勿将油漆涂刷到其它已完工的产品上，如涂刷拦杆、扶手，用塑料膜覆盖在楼板上；墙面乳胶漆和室内门窗油漆交叉施工时，应用塑料膜覆盖已完工的成品，防止交叉污染。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;第16章 预防突发事件措施&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;由公司牵头建立一个生产协调组织机构,下设人事部、财务部、材料部、设备部、后勤部、工程部，对工程中所发生的有关人员、材料、设备等突发问题，进行网络协调。&lt;/li&gt;
&lt;li&gt;施工现场设备采用备用制。当发生设备损坏等问题时，如抢修有困难，由分管部门组织调运到现场。&lt;/li&gt;
&lt;li&gt;在基础及主体施工中，采用信息法施工。由本公司具有监测资质的协作单位,随时提供边坡、 周边环境及沉降等各方面资料，使在突遇不测事件时，能迅速组织各方人力、物力抢险。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;第17章 消防、保卫措施&lt;/h1&gt;
&lt;h2&gt;第1节 消防措施&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;现场各施工队要有1名兼职消防员，对施工场内的消防工作进行全面检查，发现隐患及时处理，向职工或民工进行防火安全教育，提高其防火警惕性。&lt;/li&gt;
&lt;li&gt;在工地明显处设立消防标牌，并按规定在现场、仓库、生活区设立消防器材，或利用施工用水干管设置简易消防栓。&lt;/li&gt;
&lt;li&gt;施工现场易燃、易爆物质，设专人管理，并远离施工现场，现场施工道路要保持通畅。&lt;/li&gt;
&lt;li&gt;消防器材只用于补救火灾，在易燃、易爆施工现场严禁吸烟。&lt;/li&gt;
&lt;li&gt;现场电焊、氧割要先做好防护隔离措施，并经安全员检查后，方可正式施工。&lt;/li&gt;
&lt;li&gt;施工用电必须按国家有关规定执行，严禁非电工违章操作。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第2节 保卫措施&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;对进入现场的施工人员进行消防保卫教育，依靠全体施工人员维护施工安全。&lt;/li&gt;
&lt;li&gt;遵守建设方内部的安全保卫规章、标准。&lt;/li&gt;
&lt;li&gt;审查民工上岗证，建立健全有关安全管理现场制度，建立保卫、消防组织，签订责任书，对民工队要反复进行法制教育。&lt;/li&gt;
&lt;li&gt;指派现场护场人员日夜巡逻，严防材料、机具丢失，做好成品保护。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;第18章 环境保护措施&lt;/h1&gt;
&lt;h2&gt;第1节 环境保护责任制&lt;/h2&gt;
&lt;p&gt;在项目实施时制订出适合本项目的环境保护责任制。&lt;/p&gt;
&lt;h2&gt;第2节 建筑&amp;quot;三废&amp;quot;防治&lt;/h2&gt;
&lt;h3&gt;1. 废渣处理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;主干道车辆出口用砼硬化路面，临近门口处设一层碎石路面，防止车辆轮胎带泥。凡外运土方车辆，要注意防止车辆运出带泥，污染市区环境。&lt;/li&gt;
&lt;li&gt;按施工设计平面图，放置材料、机械设备；现场设建筑垃圾场，不准乱堆放材料及杂物，施工人员及时清理各自岗位施工现场，做到工完场净。&lt;/li&gt;
&lt;li&gt;施工现场应遵守国家有关环境保护的法律规定采取措施，控制现场的各种粉尘，废弃物以及噪声振动对环境的污染和危害。对于能够用于土方回填的建筑垃圾，则应在监理、设计充许的范围内进行回填。&lt;/li&gt;
&lt;li&gt;砂、石、砖、水泥等大宗建材，预制件、钢筋按材料进场计划进行。&lt;/li&gt;
&lt;li&gt;遵守当地政府的有关城市建设法规，服从建设方及当地城监部门的管理。同时做好现场施工的环境卫生，工程竣工后，在交验工程验收之前要做到现场工完场清。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 废水防治&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;工地临时干道两侧设好地面排水沟。基础工程土方施工期间，地下水要经沉淀后排入下水管， 施工现场路边设置排水渠，做到畅通无阻。&lt;/li&gt;
&lt;li&gt;按施工组织设计平面布置图布设施工用水、用电线路，做到做到所用电器、电源电线不漏电，施工用水水管不漏水，创造一个良好的施工现场环境。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 噪声防治&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;本工程施工中产生的最大噪声源为：&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;施工设备&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;砼搅拌机&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;砼振捣&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;卷扬机&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;运土汽车&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;噪声（dB/15m）&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;75-88&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;80-90&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;75-88&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;85-95&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;噪声控制：
由上表可知，噪声最大的为汽车运土，其次为砼振捣。为此，控制措施如下：
&lt;ol&gt;
&lt;li&gt;选用噪声较小的锥式砼搅拌机，砼搅拌机周围搭棚挂板，设置音障围护墙。（此处涉及的砼搅拌机供砼零星搅拌使用）&lt;/li&gt;
&lt;li&gt;砼振捣要快插慢提，专人负责，每层砼浇筑高度不大于250mm，以减小工地的施工噪音危害，另外，一般砼施工时间自7:30至21:30（砼浇筑提前做好&amp;quot;安民告示&amp;quot;）。&lt;/li&gt;
&lt;li&gt;调整汽车运土时间，尽量安排在中午11:00--13:00时及下午17:00--21:00时。&lt;/li&gt;
&lt;li&gt;对直接接触噪声源的操作人员采取调整作业时间、轮班换岗的防护措施，以减少噪声对一线操作人员的危害。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;施工中产生的建筑&amp;quot;三废&amp;quot;，主要有&amp;quot;废渣&amp;quot;，&amp;quot;废水&amp;quot;二类。具体防治措施如下：&lt;/p&gt;
&lt;h2&gt;第3节 其它防护措施&lt;/h2&gt;
&lt;p&gt;18.3.1设专人负责值勤，对大型设备或大型车辆进场，要由专人指挥，防止重载损坏路面。&lt;/p&gt;
&lt;p&gt;18.3.2防止施工产生的建筑垃圾，施工废水在道路乱堆、乱流。工地产生的废渣及时有组织外运，废水经沉淀分离后有组织排入市政下水道。&lt;/p&gt;
&lt;p&gt;18.3.3保护好施工现场周边的绿化区。&lt;/p&gt;
&lt;h1&gt;第19章 工程创优保证措施&lt;/h1&gt;
&lt;h2&gt;第1节 主要管理措施&lt;/h2&gt;
&lt;h3&gt;1. 推行项目管理&lt;/h3&gt;
&lt;p&gt;按项目管理模式组织实施，实现管理层和劳务层两个层次的真正分离。管理层人员做到高效、精干。除特殊工种外，劳动力在公司的劳务基地和社会劳动力市场考核招收。在实行严格进场教育的同时不断开展技能培训，以适应严格管理，并随着工作量的变化不断辞退多余人员，实行真正的动态管理。&lt;/p&gt;
&lt;h3&gt;2. 严格计划管理&lt;/h3&gt;
&lt;p&gt;计划一旦确定，必须严格实施。每天上午应由总承包单位带队，各协作单位参加，共同巡视现场，并召开当天的工程会议，检查落实计划执行情况，下午4点各协作单位应召开生产例会，落实上午会议各项指令，使整个现场施工生产活动始终处于有领导、有组织、有秩序的状态。&lt;/p&gt;
&lt;h3&gt;3. 全面推行ISO-9000质量保证体系&lt;/h3&gt;
&lt;p&gt;项目经理部通过全员培训和公司质量体系文件的学习，促进全体员工转变质量观念，更新知识，改变旧的工作习惯。编写针对性强的项目质量计划以及作业指导书，指导操作人员严格按照规范、标准作业。质保部门要按照程序文件规定，加强对施工工序的控制。从操作人员培训到计量器具，从物资检验到产品试验，均应严格按程序办事，并对质量问题进行统计分析，及时提出整改措施，以有效地改进质量。&lt;/p&gt;
&lt;h3&gt;4. 实行电脑管理&lt;/h3&gt;
&lt;p&gt;主要业务部门配置电脑，利用计算机建立数据库，对物资进场和需求计划进行有效控制，以保证工程需要。来往文件、资料以及技术方案、网络计划等应用计算机进行辅助管理。&lt;/p&gt;
&lt;h3&gt;5. 加强现场文明施工管理&lt;/h3&gt;
&lt;p&gt;优化劳动组合，改进落后的施工工艺，积极采用&amp;quot;三新&amp;quot;技术，能做出令建设方满意的产品。&lt;/p&gt;
&lt;h2&gt;第2节 优化施工方案&lt;/h2&gt;
&lt;p&gt;重点加强对建筑材料、构配件的选购，选用国家大、中型企业的优质产品，所有进场原材料、半成品，先检验，再作样板，经建设方、监理验收后，再应用于工程。&lt;/p&gt;
&lt;h2&gt;第3节 全面执行建筑规程、规范、标准&lt;/h2&gt;
&lt;p&gt;凡本工程中的分项工程施工，均按照规范中的优良标准组织施工、验收。&lt;/p&gt;
&lt;h2&gt;第4节 健全检查验收制度&lt;/h2&gt;
&lt;p&gt;按照本工程项目质量保证体系的要求，责任到人，各专业队组均由高级工带中、初级工，先做样板，做好工序交接验收，落实&amp;quot;三检&amp;quot;制度。&lt;/p&gt;
&lt;h2&gt;第5节 加强对外联系&lt;/h2&gt;
&lt;p&gt;积极加强建设方、设计单位的联系，提前介于图纸设计，把好图纸会审关。&lt;/p&gt;
&lt;h2&gt;第6节 执行施工中提出的各种方案措施&lt;/h2&gt;
&lt;p&gt;按照本工程施工组织设计中的主要分项工程的质量预控措施，精心组织施工。&lt;/p&gt;
&lt;h2&gt;第7节 抓好质量预控&lt;/h2&gt;
&lt;p&gt;抓重点质量控制点，以施工人员素质、材料、施工顺序、技术间隔、参数、常见的质量通病、特种结构、&amp;quot;三新&amp;quot;技术应用、施工工艺及方法为重点，做好预防预控。&lt;/p&gt;
&lt;h2&gt;第8节 抓好过程控制&lt;/h2&gt;
&lt;p&gt;抓施工操作质量、工序质量、隐蔽验收、工程施工预检及成品保护。施工过程中，按照人、材料、机械、方法和环境4MIE质量因素进行全面的控制。&lt;/p&gt;
&lt;h2&gt;第9节 竣工的前期准备&lt;/h2&gt;
&lt;p&gt;工程竣工前5天，组织公司、项目班子及建设方、监理，对工程进行预检预评，争取一次性验收合格，以确保达到预期的质量目标创造条件。&lt;/p&gt;
&lt;h1&gt;第20章 季节性施工&lt;/h1&gt;
&lt;h2&gt;第1节 雨季施工&lt;/h2&gt;
&lt;p&gt;20.1.1防地表水、雨水流入基坑，并及时抽干集水井的余水，基础砼垫层施工，应采取及时浇筑砼封闭基底，以防雨水浸泡，扰动基层。&lt;/p&gt;
&lt;p&gt;20.1.2认真做好天气预报记录，尽量避免雨天浇筑砼，并在现场备足防雨材料。刚浇筑的砼若突然下雨，应及时遮盖，雨后继续施工时，要及时检查砂石的实际含水率，调整砼的施工配合比。&lt;/p&gt;
&lt;p&gt;20.1.3堆放砌块的场地应有防雨和排水措施，雨后继续砌筑时，必须复核已完砌体的垂直度、平整度和标高，不得使用饱和水状的砖块，以免砌筑时砂浆流失，使砌体产生滑移或墙体干缩。&lt;/p&gt;
&lt;p&gt;20.1.4做好用电设备的防雨防护，接地电阻应小于4Ω，塔吊、人货电梯、钢管脚手架还应有避雷接地装置。大雨过后，要注意复检脚手架、人货电梯的安全，尤其是各种安全限位装置，并注意防止脚手架、模板支撑下陷。&lt;/p&gt;
&lt;h2&gt;第2节 夏季施工&lt;/h2&gt;
&lt;p&gt;20.2.1高温期要适当调整露天作业作息时间，避免中午从事焊接等高温作业，保证职工的茶水供应，做好职工的防署降温工作。&lt;/p&gt;
&lt;p&gt;20.2.2高温期间，砼施工配合比要作适当调整，控制减水剂的用量，要延长终凝时间，克服坍落度损失，浇筑砼前对模板要充分浇水湿润，拆模后，加强对砼的养护。&lt;/p&gt;
&lt;p&gt;20.2.3高温期使用的砂浆、砼要随拌随用，并在2小时内用完，砖要提前浇水，抹灰面和装饰面的基层，施工前也要提前浇水湿润。&lt;/p&gt;
&lt;p&gt;20.2.4注意搞好食品卫生，做好防病驱病。&lt;/p&gt;
&lt;p&gt;冬季施工措施在前面相关章节做了阐述。&lt;/p&gt;
&lt;h1&gt;第21章 降低成本措施&lt;/h1&gt;
&lt;h2&gt;第1节 计量及信息管理&lt;/h2&gt;
&lt;h2&gt;第2节 计量管理目标&lt;/h2&gt;
&lt;h3&gt;1. 本工程计量管理目标为&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;保证各种原材料计量误差不大于1.0%。&lt;/li&gt;
&lt;li&gt;执行计划控制，限额领料，加强材料成本管理。&lt;/li&gt;
&lt;li&gt;保证工程施工误差不超过规范标准。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 计量管理措施&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;计量设备及工具：磅称、钢尺、经纬仪、水准仪：所有计量仪器、设备须经有关计量部门校准合格，对施工中各种测量仪器做好复检。&lt;/li&gt;
&lt;li&gt;人员：工地专职一名计量员，负责计量及计量仪器保管、保养，负责计量核准。&lt;/li&gt;
&lt;li&gt;措施
对于施工工人及管理人员，要进行计量工作交底，并有书面规范文件。对本工程要重点做好砼中的水泥、水、砂、石子、外加剂的计量，以确保工程砼的施工质量。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第3节 信息管理&lt;/h2&gt;
&lt;h3&gt;1. 按照《ISO9000》贯标，采用电脑管理&lt;/h3&gt;
&lt;p&gt;本工程按照(GB/T19001-2000 ido 9001:2000)《质量管理体系要求》实施质量管理，主要管理手段采用电脑，其质量管理采用现代项目管理技术对施工现场进行信息管理，主要技术条件采用电脑网络。电脑管理执行二级网络: 公司信息控制中心、项目部工作站。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;项目信息管理基础要求:
&lt;ol&gt;
&lt;li&gt;项目部内部组织管理职能职责分工明确化；&lt;/li&gt;
&lt;li&gt;项目管理标准化；&lt;/li&gt;
&lt;li&gt;工程施工档案文件规范化；&lt;/li&gt;
&lt;li&gt;信息管理、收集、整理、保存制度化。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;项目信息管理主要有四大系统:
&lt;ol&gt;
&lt;li&gt;成本控制系统：工程预算、定额管理、材料、人工、机械价格市场信息、资金控制；&lt;/li&gt;
&lt;li&gt;进度控制系统：工程进度管理、工程日进度控制、工程日进度控制调整；工序搭接管理；&lt;/li&gt;
&lt;li&gt;质量控制系统：规范执行检查、工程质量检查、材料检验、隐蔽工程验收、质量事故处理、技术交底、工序交接管理；&lt;/li&gt;
&lt;li&gt;工程档案管理系：工程资料、安全资料、质量管理及各种计划、报表。合同管理系统。&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 管理职责&lt;/h3&gt;
&lt;p&gt;本工程的现场信息管理，对计划统计进行编制的部门和各级责任管理人员相应职责应充分明确。&lt;/p&gt;
&lt;h3&gt;3. 本工程信息管理&lt;/h3&gt;
&lt;p&gt;本信息管理工作包括：信息收集整理、记录存贮、统计分析、交流传递、决策反馈、检索查询等。&lt;/p&gt;
&lt;h2&gt;第4节 项目部信息管理&lt;/h2&gt;
&lt;p&gt;为适应现代建筑施工管理，项目经理部为本公司计算机管理系统终端，项目经理、资料员要求熟炼地掌握计算机，施工管理电脑化。项目电脑操作员要有操作证，并能熟炼应用管理软件。为了加强项目的信息管理，要做好与监理的配合。&lt;/p&gt;
&lt;p&gt;本工程最终完成的工程技术资料，全部为A3--A4规格，并按照本公司的信息管理要求进行整理、归档、交付验收。&lt;/p&gt;
&lt;p&gt;为规范项目部的信息管理，另为本工程编制了质量管理手册，具体实施应按照质量管理手册有关章节执行。&lt;/p&gt;
&lt;p&gt;21.1采用流水施工，科学管理，均衡生产，减少一次性投入，减少现场材料的二次转运。&lt;/p&gt;
&lt;p&gt;21.2钢筋集中下料，水泥由厂家直接供货，减少中间损耗。&lt;/p&gt;
&lt;p&gt;21.3对如挖土、搬运等工序多召收普工，降低人工费用。&lt;/p&gt;
&lt;p&gt;21.4采用新型模板，加强模板管理，优化模板设计，加快周转，提高效益。&lt;/p&gt;
&lt;p&gt;21.5加强计量，加强计划管理，节约水泥，砼内掺加优良外加剂。&lt;/p&gt;
&lt;p&gt;21.6改进工艺，引进新技术、新材料。&lt;/p&gt;
&lt;p&gt;21.7采用样板施工，减少返工损失，规范操作技术，减少材料损失。&lt;/p&gt;
&lt;h1&gt;第22章 主要质量通病防治措施&lt;/h1&gt;
&lt;h2&gt;第1节 质量通病防范措施&lt;/h2&gt;
&lt;p&gt;根据本工程特点，主要对基础工程、砌体工程、砼工程工程质量通病予以防范。&lt;/p&gt;
&lt;h2&gt;第2节 装修工程质量通病防范&lt;/h2&gt;
&lt;h3&gt;1. 楼地面&lt;/h3&gt;
&lt;p&gt;主要通病为楼地面起壳、开裂、起砂等。首先好板面处理，按照要求经清洗干净，方可进行楼面其他作业。&lt;/p&gt;
&lt;p&gt;地面起壳、起砂等问题，主要原因是基层未处理好，水泥砂浆或者砼垫层配合比及水泥自身质量问题，另外，工人操作不当也易出类似通病。主要防范措施：冲洗干净楼面，但不应有积水，水泥采用32.5级普通水泥，砂子模数在2.3以上，含泥量不大于1%，施工中，操作者不应多次反复赶平，以免使砂浆产生离析，水泥必须合格。&lt;/p&gt;
&lt;h3&gt;2. 外墙涂料&lt;/h3&gt;
&lt;p&gt;主要通病是泛色、流坠表面不平整等。防范措施有：涂料一次性进场，基层要平整，先做样板。基层施工时，表面先处理好，涂料施工按顺序由上而下进行。本工程由专业公司承担外墙涂料施工。&lt;/p&gt;
&lt;h3&gt;3. 防水工程&lt;/h3&gt;
&lt;p&gt;屋面防水注意先做好基层处理，凡女儿墙泛水、管道口、天沟等节点重点处理，加铺一毡，采用新型防水卷材先做好技术交底。卫生间注意管道口节点防水处理，室内加做一层防水卷材，上卷高度大于350mm，内墙粉刷加道防水腻子，瓷砖施工主要有：瓷砖基层面先刮水泥浆封闭基层毛细孔；勾缝要细致、平整、密实。&lt;/p&gt;
&lt;h3&gt;4. 内墙乳胶漆涂料&lt;/h3&gt;
&lt;p&gt;重点注意施工中有刮痕、掉粉、泛色，主要措施有：&lt;/p&gt;
&lt;p&gt;(1)先做样板，检查涂料原材料质量；&lt;/p&gt;
&lt;p&gt;(2)首先处理好粉刷基层，刮底层时要薄，要平整，基层不可过干；&lt;/p&gt;
&lt;p&gt;(3)控制好涂料的进场验收，配料要严格计量，胶料要选用合格厂家优质产品，施工由专业队进行，注意细心处理好节点。&lt;/p&gt;
&lt;h3&gt;5. 门窗&lt;/h3&gt;
&lt;p&gt;本项工程土建施工要做好洞口预留尺寸，采用模尺统一，施工由专业队伍进行。质量控制首先注意把好材料关；其次注意现场组装关，必须要经样板验收合格，方可进行大面积正式施工；再次，要用包装薄膜做好产品的成品防护，并禁止其他工种插入施工，以避免二次损坏。&lt;/p&gt;
&lt;h1&gt;第23章 资料管理措施&lt;/h1&gt;
&lt;p&gt;本工程现场设置专职资料员一名，主要负责技术和经济资料的收集与管理。某些资料的管理采用微机管理，以备随时存查。项目测试员、材料员、核算员和各专业工长应按公司的项目管理标准和岗位工作标准的要求，负责本专业资料的汇总和整理工作。&lt;/p&gt;
&lt;p&gt;钢材、水泥、砖、砂石等进入施工现场时，材料员应提供材料出厂证明和合格证,测试员应及时送检并应按时反馈回试验资料。各专业工长，质检员应按工程形象进度提供隐蔽记录和质检资料等。&lt;/p&gt;
&lt;p&gt;专职资料员每月２５日向各管理人员收集一次技术和经济资料，并按公司要求进行归档和整理编码。随时接受公司技术和经济部门的检查。&lt;/p&gt;
&lt;p&gt;工程收尾阶段，技术和经济资料须按合同要求的份数再一次进行系统化、规范化整理并送交公司技术科和财务部进行审查，通过后方可送质检站办理竣工验收手续。&lt;/p&gt;
&lt;p&gt;施工文件资料：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;文件名称&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;责任人&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;施工合同书&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;公司法人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;开工报告书&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;项目经理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;技术交底、图纸会审纪要&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;内业技术员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;施工组织设计或施工方案&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;项目技术负责人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;设计变更通知单、核定单&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;内业技术员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;原材料出厂质量证明书&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;材料员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;原材料试验报告&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;试验员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;施工定位测量记录&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;测量员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;主体工程隐蔽记录&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;工长&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;分部、分项单位工程质量评定及质量事故处理报告&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;质量安全员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;11&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;交工验收证明书&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;内业技术员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;施工总结、技术总结&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;项目技术负责人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;13&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;竣工报告（含停、复工报告）&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;项目经理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;14&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;施工日志、大事记&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;工长&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;竣工图：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;文件名称&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;责任人&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;土建建施竣工图&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;土建内业技术员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;土建结施竣工图&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;土建内业技术员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;水电安装竣工图&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;安装技术负责人&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;第24章 竣工交付使用后的回访工作&lt;/h1&gt;
&lt;p&gt;我公司按照图纸设计要求及现行的有关施工规范要求精心组织施工，使本工程如期竣工，并达到承诺的工程标准。交付使用后，我公司将按照建设部《建筑工程保修法》的要求，定期回访，认真及时处理保修问题，保障工程使用阶段的质量，实现我公司对该工程质量负责的有关承诺。&lt;/p&gt;
&lt;p&gt;&amp;quot;百年大计，质量第一&amp;quot;，建设方兴建一栋建筑物，将耗用大量的人力、物力、财力。我公司将采用科学态度认真完成每一项工作，从建筑的结构、安全、适用、经济、合理及使用功能，耐久性等方面入手抓工程质量创优，讲究职业道德与精益求精的作风。&lt;/p&gt;
&lt;p&gt;为维护建设方的权利，对建设方负责，我公司对已竣工工程均实行保修服务。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;竣工验收后，向用户发放《工程质量意见单》，回收所有意见单、建档，并针对用户提出的质量问题，逐一处理。&lt;/li&gt;
&lt;li&gt;使用阶段前期，组织专班负责修缮被破坏的部分和建设方指定需要修改的部分。&lt;/li&gt;
&lt;li&gt;工程使用阶段按公司程序文件要求实行回访保修制度、专人联系制度和及时处理制度。
a. 保修期： 基础及主体结构 合理使用年限
屋面工程 五 年
水电安装 二 年
b. 回 访： 第一年 每季一次
第二年 每半年一次
以 后 每年一次
c. 及时处理：接通知后，24小时内到现场，一周内处理。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;第25章 附图表&lt;/h1&gt;
&lt;p&gt;附 件 施工平面布置图&lt;/p&gt;
&lt;p&gt;附 件 总体施工程序框图&lt;/p&gt;
&lt;p&gt;附 件 现场管理组织机构框图&lt;/p&gt;
&lt;p&gt;附 件 结构工程主要施工机具表&lt;/p&gt;
&lt;p&gt;附 件 装修工程主要施工机具表&lt;/p&gt;
&lt;p&gt;附 件 安装工程主要施工机具表&lt;/p&gt;
&lt;p&gt;附 件 临时设施及用地表&lt;/p&gt;
&lt;p&gt;附 件 劳动力计划表&lt;/p&gt;
&lt;p&gt;附 件 质量检测设备一览表&lt;/p&gt;
&lt;p&gt;附 件 施工进度网络计划&lt;/p&gt;
&lt;p&gt;附 件 施工进度横道图&lt;/p&gt;
&lt;p&gt;附 件 质量控制程序&lt;/p&gt;
&lt;p&gt;附 件 基础工程质量预控措施&lt;/p&gt;
&lt;p&gt;附 件 混凝土工程质量预控措施&lt;/p&gt;
&lt;p&gt;附 件 砌体工程质量预控措施&lt;/p&gt;
&lt;p&gt;附 件 质量控制点表a&lt;/p&gt;
&lt;p&gt;附 件 质量控制点表b&lt;/p&gt;
&lt;p&gt;附 件 质量控制点表c&lt;/p&gt;
&lt;p&gt;附 件 安全生产管理系统图&lt;/p&gt;            </description>
            <pubDate>2026-05-14 05:08:58</pubDate>
            <link>https://www.syuez.com/blog/%E5%B7%A5%E7%A8%8B%E6%8A%95%E6%A0%87%E4%B9%A6%E8%8C%83%E6%9C%AC.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%B7%A5%E7%A8%8B%E6%8A%95%E6%A0%87%E4%B9%A6%E8%8C%83%E6%9C%AC.html</guid>
                                               <category>招投标</category>
                                    </item>
                <item>
            <title>DLT645通信规约</title>
            <description>
            &lt;!--
author: admin
date: 2023-03-06
title: DLT645通信规约
tags: 网络编程
category: Linux
status: publish
summary: 前有DL/T645，后有DL/T698
--&gt;
&lt;h1&gt;DLT645通信规约&lt;/h1&gt;
&lt;p&gt;DL/T645规约是针对电表通信而制定的通信协议，目前分两个版本，一个为1997年制定的称为97规约，还有就是2007年制定的07规约。目前二者并存于市场中，要弄清楚二者的差异。&lt;/p&gt;
&lt;h3&gt;数据帧格式&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;index_files/302dfad2-870c-4b02-8cdf-a8b93399b544.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里需要注意的点有：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;地址域长度不足时有用00H补齐的，也有用AA补齐的(在高位补齐)，这里可以自己测试一下。&lt;/li&gt;
&lt;li&gt;数据域中的数据接受和发送的时候都是需要处理的，主站发送时加&lt;code&gt;0x33&lt;/code&gt;，接收从站数据时减&lt;code&gt;0x33&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;所有的数据项（地址域、数据域）都需要按着低字节在前，高字节在后的远程传输。&lt;/li&gt;
&lt;li&gt;一般需要在每一帧数据前加上前导字节：&lt;code&gt;FE FE FE FE&lt;/code&gt;即可（用在需要唤醒的设备上）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FE FE FE 68 AA AA AA AA AA AA 68 13 00 DF 16&lt;/code&gt;可以读出准确地址，&lt;code&gt;AA AA AA AA AA AA&lt;/code&gt;算是读表地址专用地址，&lt;code&gt;13&lt;/code&gt;控制码，根据协议，就是读地址控制码，&lt;code&gt;DF&lt;/code&gt;为校验，&lt;code&gt;16&lt;/code&gt;是结尾。&lt;/li&gt;
&lt;li&gt;校验码从第一个起始符算起，&lt;strong&gt;包含第一个起始符&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;数据域的结构随控制码的功能而改变，可以是：数据标识、密码、操作者代码、数据、帧序号等等。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;控制码&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;index_files/a9383edf-5bb4-4d71-9ee1-caef6f21952a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;常见数据标识&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e6b7d761-7303-462c-b3e0-84f4edf9f922.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;举例说明&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;发送查表数据：&lt;/strong&gt; &lt;code&gt;68 25 04 03 02 01 00 68 11 04 33 33 34 33 E1 16&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;数据&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;起始帧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25 04 03 02 01 00&lt;/td&gt;
&lt;td&gt;地址域，实际地址为0102030425&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;起始帧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;控制码，在07规约中就是读数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;04&lt;/td&gt;
&lt;td&gt;数据域数据长度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33 33 34 33&lt;/td&gt;
&lt;td&gt;数据域，减去&lt;code&gt;33H&lt;/code&gt;为&lt;code&gt;00 00 01 00&lt;/code&gt;，再&lt;strong&gt;高低位反转&lt;/strong&gt;得到实际数据为 &lt;code&gt;00 01 00 00&lt;/code&gt;，表示读正向有功总&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E1&lt;/td&gt;
&lt;td&gt;校验码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;结束符&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;返回数据：&lt;/strong&gt; &lt;code&gt;68 25 04 03 02 01 00 68 91 08 33 33 34 33 75 39 45 33 8B 16&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;数据&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;起始帧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25 04 03 02 01 00&lt;/td&gt;
&lt;td&gt;地址域，实际地址为0102030425&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;起始帧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;控制码：&lt;code&gt;10010001&lt;/code&gt;，第一位1代表从站发给主站，后面的10001=11H读数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;08&lt;/td&gt;
&lt;td&gt;数据长度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33 33 34 33 75 39 45 33&lt;/td&gt;
&lt;td&gt;同上解析，00010000 表示正向有功总；75 39 45 33 → 42 06 12 00,将其高低位发转，00120642，再根据规约中对于正向有功总的数据格式(xxxxxx.xx)得到的数值为1206.42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8B&lt;/td&gt;
&lt;td&gt;CS校验&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;结束符&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://codeantenna.com/a/amoo3ybyiX&quot;&gt;DL645通信协议97/07规约（附上下行例子） - CodeAntenna&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/weixin_41218348/article/details/126520456&quot;&gt;DLT645协议解析(二)---07协议数据帧结构解析_Simba X的博客-CSDN博客&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/DLT645%E9%80%9A%E4%BF%A1%E8%A7%84%E7%BA%A6.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/DLT645%E9%80%9A%E4%BF%A1%E8%A7%84%E7%BA%A6.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>大酒店室内装修工程施工组织设计方案</title>
            <description>
            &lt;!--
author: admin
date: 2023-02-15
title: 大酒店室内装修工程施工组织设计方案
tags: 施工, 设计
category: 设计方案
status: publish
summary: 设计方案
--&gt;
&lt;h3&gt;4-3 质量管理和组织措施&lt;/h3&gt;
&lt;p&gt;建立完善的质量控制体系，进行事前控制，事后控制，分三个阶段全过程保证工程的质量。&lt;/p&gt;
&lt;p&gt;4-3-1 质量管理的主要内容：认真贯彻执行各级质量方针政策，以及各项技术标准、规范、规程、规定。&lt;/p&gt;
&lt;p&gt;4-3-2 制定各项工程质量管理制度，运用全面管理的科学方法。&lt;/p&gt;
&lt;p&gt;4-3-3 确立保证工程质量的技术措施，坚持进行工程质量检查和评定，坚持以预防为主的方针，实行专职检查与班组自查相结合的方法。&lt;/p&gt;
&lt;p&gt;4-3-4 认真做好质量回访工作。&lt;/p&gt;
&lt;p&gt;4-3-5 建立和完善质量组织机构，明确项目经理为第一责任人，制订各部门、各主要管理人员相应的质量职责和岗位工作标准。根据工程规模、施工人数及工程特点，配置专职质检员负责施工过程中的质量检查和监督。质监系统直接接受公司经理领导，独立行使质量监督权、质量否决权、停工权、返工权、奖罚建议权，对质量评比负责。&lt;/p&gt;
&lt;p&gt;4-3-6 严格执行工序之间交接的三检抽和分部分项工程质量四级评比制度，做到完成一项，检查评定一项。&lt;/p&gt;
&lt;p&gt;4-3-7 建立质量奖罚制度及定期评比制度。由生产经理组织相关部门定期进行质量检查评比，执行重奖重罚制度，将工程质量与每个职工的利益挂钩，实行优质优价。&lt;/p&gt;
&lt;p&gt;4-3-8 建立材料质量跟踪管理制度，对钢材、水泥等主要材料必须严格按规格、厂家、批号、进货日期分区堆放标识，同时做好质量记录，建立台帐，达到施工使用部位与材料规格对号相符的目的。&lt;/p&gt;
&lt;p&gt;4-3-9 扎实持久地推广全面质量管理，完善企业方针目标管理，进一步推动群众性质量活动，开展具有“小、实、活、新”特色的QC活动；针对质量通病，确定攻关课题，开展质量攻关，按要求进行专场管理。&lt;/p&gt;
&lt;p&gt;4-3-10 建立健全职工培训制度，运用多种形式，多渠道、多层次的培训方式，提高广大职工的操作技能和敬业精神。&lt;/p&gt;
&lt;h3&gt;4-4 工程质量过程控制&lt;/h3&gt;
&lt;p&gt;4-4-1 收到施工图后及时组织内部会审，弄懂、吃透全部内容，并参加业主组织的技术交底和图纸会审。根据工程的特点，由项目技术部门编制详细的操作性技术文件，并督促实施。&lt;/p&gt;
&lt;p&gt;4-4-2 测量人员持证上岗，测量设备和仪器定期检验，满足测设精度要求。&lt;/p&gt;
&lt;p&gt;4-4-3 施工员对每一道工序进行技术交底，并组织操作主管组对每一道工序进行自检、互检，专职质检员进行施工过程中的预检和中间检查，符合设计要求和验评标准后，方可进入下一道工序。隐蔽工程自检合格后，及时报请业主代表、质监、设计等相关人员进行检查验收并提交签证资料，对各方签署的意见作详细记录。对关键工序和特殊工序制订相应的指导书或技术交底，并由技术、质安部门实行监控。&lt;/p&gt;
&lt;p&gt;4-4-4 质量记录和资料填写必须及时、完整，工程完工后及时向建设单位提供竣工资料。&lt;/p&gt;
&lt;h3&gt;4-5 保证质量技术措施&lt;/h3&gt;
&lt;p&gt;4-5-1 严格执行“三个百分之百”的技术管理制度，即“图纸要会审、施工方案要审批、技术要交底”方可施工的技术管理制度，以严肃认真的工作态度来保证工程质量。&lt;/p&gt;
&lt;p&gt;4-5-2 严格把好四道关，即“人员关”、“工艺关”、“材料关”和“检验关”。&lt;/p&gt;
&lt;p&gt;4-5-3 严把施工人员素质关，凡进入本工程施工作业人员进场前实施严格考核，不合格者不得进场作业。加强职工工种质量意识教育和操作技能培训，提高广大职工的质量总体意识和操作技能，做到人人持证上岗。&lt;/p&gt;
&lt;p&gt;4-5-4 坚持合理的施工程序，严格按图纸和规范施工，建立工序控制工作标准和技术复查制度，严肃施工工艺纪律，实行工程过程施工的标准化，程序化，积极采用新工艺，不断提高工种质量、降低成本。&lt;/p&gt;
&lt;p&gt;4-5-5 严格把好材料检验关，材料进场前必须送样检查，经过批准后，方可订货进场。材料要有产品合格证，并根据规定做好各项材料的试验、检验工作，不合格的材料不准进入现场。&lt;/p&gt;
&lt;p&gt;4-5-6 每道工序施工前，施工负责人必须向操作人员详细地技术交底，施工过程中及时进行质量检查和认可，班组要严格执行自检、互检、交接检验工序制度，把自检和专职检查结合起来，实行层层把关。&lt;/p&gt;
&lt;p&gt;4-5-7 认真做好建筑物测量定位工作，建立统一的控制导线及高程永久控制桩。建筑物四周做永久性控制桩，标明轴线、中心线、标高等，邀请业主、监理代表做好测量复测验收工作。&lt;/p&gt;
&lt;p&gt;4-5-8 及时做好隐蔽工程验收工作。砼浇捣前会同三方对地基进行检查、并做好隐蔽工程验收记录，方可浇筑砼。&lt;/p&gt;
&lt;h3&gt;4-6 夜间施工措施&lt;/h3&gt;
&lt;p&gt;4-6-1 保证施工现场足够的照明，防止因光线不足影响施工质量及产生操作误差。&lt;/p&gt;
&lt;p&gt;4-6-2 施工道路、洞口、周边均设置红色警示灯，使施工现场做到一目了然。&lt;/p&gt;
&lt;p&gt;4-6-3 除特殊部位及特殊要求外，夜间十点以后不安排产生噪音的施工作业，遵守国家有关防止噪音的国家规范及当地政府的有关规定。&lt;/p&gt;
&lt;h3&gt;4-7 质量保证措施与控制点&lt;/h3&gt;
&lt;p&gt;4-7-1 执行国家施工质量标准，制定质量保证计划，专人监督，发现问题及时向公司反馈，进行整改。&lt;/p&gt;
&lt;p&gt;质量控制点为：砌体工程质量控制点、钢筋工程质量控制点、模板工程质量控制点、砼工程质量控制点、渗漏通病防治工程质量控制点、装饰工程质量控制点、水电安装工程质量控制点、季节性施工措施。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;五、保证安全措施&lt;/h2&gt;
&lt;p&gt;切实贯彻“安全第一、预防为主”的方针，认真执行国家和公司有关安全生产的法规制度。&lt;/p&gt;
&lt;p&gt;5-1 明确项目经理是项目部安全生产第一责任人，明确安监员对安全生产具有一票否决权，安监员有权决定停工整改。&lt;/p&gt;
&lt;p&gt;5-2 设置专项安监员，负责以下工作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;施工现场巡视检查，及时通知有关人员近期消除隐患；&lt;/li&gt;
&lt;li&gt;检查电气线路开关和漏电保护装置是否都整齐有效；&lt;/li&gt;
&lt;li&gt;检查架子、立网是否牢固可靠，是否符合安全规格；&lt;/li&gt;
&lt;li&gt;监督施工人员遵守操作规程，制止违章作业；&lt;/li&gt;
&lt;li&gt;检查夜间施工及场内道路的照明设施；&lt;/li&gt;
&lt;li&gt;按建设部的安全检查评分八种表格和公司现场安全管理各种表格，要求及时填写安全资料归档，搞好安全生产作业管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;5-3 安全交底和安全教育定期进行，安全交底由技术负责人主持。&lt;/p&gt;
&lt;p&gt;5-4 进场的工人均进行严格的三级安全教育，特种作业工人持证上岗。&lt;/p&gt;
&lt;p&gt;5-5 每一分项工程作业前由施工员下达书面安全交底，班组履行签字后才能施工。&lt;/p&gt;
&lt;p&gt;5-6 进入施工现场的人员必须戴好安全帽，禁止穿高跟鞋、拖鞋、打赤脚、赤膊。&lt;/p&gt;
&lt;p&gt;5-7 架子周围采用密布安全网进行全处理，以防高空坠物，危及过往行人及工人的人身安全，作业面及二步外架面采用竹架板铺满铺牢，防止坠物伤人。&lt;/p&gt;
&lt;p&gt;5-8 进料口以及交叉通道搭设防护棚、严防高处坠物伤人。&lt;/p&gt;
&lt;p&gt;5-9 出现安全事故及未遂事件坚持“三不放过”的原则，查明原因，处分责任人，吸取教训。&lt;/p&gt;
&lt;p&gt;5-10 靠近通道的外加处用彩条布进行全封闭处理，以免施工时向外坠落施工垃圾以及灰尘，保护人员安全。&lt;/p&gt;
&lt;p&gt;5-11 工地建立防火责任制，职责明确。按规定设专职防火干部和专职消防员，建立防火档案并正确填写。&lt;/p&gt;
&lt;h3&gt;5-12 脚手架&lt;/h3&gt;
&lt;h4&gt;（一）材料&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;脚手架整体承受部位应牢固，宽度不小于2m，并做好排水措施。各类金属脚手架要加设接地装置。&lt;/li&gt;
&lt;li&gt;钢管、角铁、扣件、螺栓的质量应符合规范的要求。&lt;/li&gt;
&lt;li&gt;不准使用锈蚀、弯瘪、滑牙和有裂缝的金属杆件。&lt;/li&gt;
&lt;li&gt;不准使用锈蚀铁丝作拉结和绑扎辅料。&lt;/li&gt;
&lt;li&gt;脚手架步距不得大于180cm，外端挑出应大于25cm。&lt;/li&gt;
&lt;li&gt;阴、阳墙角处立杆距墙的近端不得大于30cm。&lt;/li&gt;
&lt;li&gt;脚手架横向距≤1.2m，满堂脚手架≤1.8m&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（二）软硬拉结&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;各类拉结、支撑点应符合规范要求。&lt;/li&gt;
&lt;li&gt;软拉结双股并联，不得拉结在窗框、水落管和锈蚀金属预埋件上。&lt;/li&gt;
&lt;li&gt;设置预埋硬拉结处，混凝土强度应达到设计标准。&lt;/li&gt;
&lt;li&gt;硬拉结和脚手架立杆连接点不准采用电焊连接。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（三）搭接&lt;/h4&gt;
&lt;p&gt;钢管脚手架剪力撑、斜撑搭接长度不小于0.4m，且不少于2只扣件紧固。&lt;/p&gt;
&lt;h4&gt;（四）栏杆&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;施工操作层必须满铺脚手板，两端绑扎牢固。&lt;/li&gt;
&lt;li&gt;铺设竹笆层时，设置40cm围护笆或≥1mm的小眼安全网。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（五）登高设施&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;斜道：走人的斜道坡度不得大于1/3，运料的斜道坡度不得大于1/4，并应铺设竹笆或加设防滑措施。&lt;/li&gt;
&lt;li&gt;斜道应设置不小于3至4m^2的平台。斜道纵向外侧及横向两终端应设置剪刀撑。登高挂梯不得设置在脚手架通道中间。登高挂梯架子纵向外侧应设置剪刀撑。&lt;/li&gt;
&lt;li&gt;斜道坡度两侧应加设两道防护栏杆。斜道平台、登高平台临边应设竹笆防护，不得采用40cm踢脚笆或安全网。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（六）验收&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;脚手架应有分部、分段按施工进度的书面验收报告。&lt;/li&gt;
&lt;li&gt;各种脚手架应在验收合格后挂牌使用。&lt;/li&gt;
&lt;li&gt;扣件的扭力矩应按规范要求测试，抽点验收。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5-13 “三安”“四口”安全保护措施&lt;/h3&gt;
&lt;h4&gt;（一）安全帽&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;安全帽必须经有关部门验收合格后方能使用。&lt;/li&gt;
&lt;li&gt;正确使用安全帽并扣好帽带。&lt;/li&gt;
&lt;li&gt;不准把安全帽抛、扔或坐、垫。&lt;/li&gt;
&lt;li&gt;不准使用缺衬、缺带或破损安全帽。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（二）安全带&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;安全带必须经有关部门验收合格后方能使用。&lt;/li&gt;
&lt;li&gt;安全带使用两年后，必须按规定抽检一次，对抽检不合格的，更换安全绳后才能使用。安全带应储存在干燥、通风的仓库内，不准接触高温，明火、强碱酸或尖锐的坚硬物体。&lt;/li&gt;
&lt;li&gt;安全带应高挂低用，不准将绳打结使用。安全带上的各种部件不得任意拆除，更换新绳时要注意加绳索。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（三）安全网&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;从二层楼面起设安全网，往上每隔一层设置一道。&lt;/li&gt;
&lt;li&gt;网绳不破损并生根牢固、绷紧、圈牢、拼接严密。&lt;/li&gt;
&lt;li&gt;网宽不小于2.6m，里口离墙不得大于15cm，外高内低。&lt;/li&gt;
&lt;li&gt;立网随施工层加高，网高出施工层1m以上，网之间拼接严密，空隙不大于10cm。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（四）楼梯口&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;分层施工楼梯口应装临时护栏。&lt;/li&gt;
&lt;li&gt;楼段边设临时防护栏杆（用钢管或毛竹）。&lt;/li&gt;
&lt;li&gt;顶层楼梯口应随施工安装正式栏杆或临时护栏。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（五）底层通道口&lt;/h4&gt;
&lt;p&gt;固定出入通道应搭设防护棚，棚宽大于道口。&lt;/p&gt;
&lt;h3&gt;5-14 施工用电&lt;/h3&gt;
&lt;h4&gt;（一）支线搭设&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;配电箱的电缆线应有套管，电线进出不混乱，大容量电箱上进线加滴水管。支线绝缘好，无老化、破损和漏电。&lt;/li&gt;
&lt;li&gt;支线应沿墙或电杆架空敷设，并用绝缘子固定。&lt;/li&gt;
&lt;li&gt;过道电线应采用硬质护套管埋地并作标志。&lt;/li&gt;
&lt;li&gt;室外支线应用橡皮线架空，接头不受拉力并符合要求。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（二）现场照明&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;一般场所采用220V电压。危险、潮湿场所和金属容器内的照明及手持照明机具，应采用符合要求的安全电压。&lt;/li&gt;
&lt;li&gt;照明导线用绝缘子固定，严禁使用花线或塑料胶质线，导线不得随地拖拉或绑在脚手架上。灯具的金属外壳必须接地或接零，单相回路内的照明开关箱必须装设漏电保护器。&lt;/li&gt;
&lt;li&gt;室外照明灯具距地面不得低于3m，室内距地面不得低于2.40m，碘钨灯固定架设，要保证安全。钠、铊等金属卤化物灯具的安装高度宜在5m以上，灯线不得靠近灯具表面。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（三）架空线&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;架空线必须设在专用电杆（水泥杆、木杆）上，严禁架设在树或脚手架上。&lt;/li&gt;
&lt;li&gt;架空线应装设横担和绝缘子，其规格、线间距离、档距等应符合要求，其电杆板线离地2.50m以上应加缘子。&lt;/li&gt;
&lt;li&gt;架空线一般应离地4m以上，机动车道为6m以上。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（四）电箱（配电箱、开关箱）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;电箱应有门、锁、色标和统一编号。&lt;/li&gt;
&lt;li&gt;电箱内开关电器必须完整无损，接线正确，各类接触装置灵敏可靠，绝缘良好，无积灰、杂物，箱体不得歪斜。&lt;/li&gt;
&lt;li&gt;线箱安装高度和绝缘材料等均应符合规定。&lt;/li&gt;
&lt;li&gt;电箱内应设置漏电保护器，选用合理的额定漏电动作电流进行分极配合。&lt;/li&gt;
&lt;li&gt;配电箱应设总熔丝、分熔丝、分开关，零排地排齐全，动力和照明分别设置。&lt;/li&gt;
&lt;li&gt;配电箱的开关电器应与配电线或开关箱一一对应配合，作分路设置，以确保专路专控；总开关电器与分路开关电器的额定值，动作整定值相适应。熔丝应和用电设备的实际负荷相匹配。&lt;/li&gt;
&lt;li&gt;金属外壳电箱应作接地或接零保护。&lt;/li&gt;
&lt;li&gt;开关箱和用电设备实行一机一闸一保险。&lt;/li&gt;
&lt;li&gt;同一移动开关箱严禁配有380V和220V两种电压等级。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（五）接地接零&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;接地体可用角钢、圆钢或钢管，但不得用螺纹钢，其截面不小于48mm^2，一组两根接地体之间间距不小于2.50m，入土深度不小于2m，接地电阻应符合规定。&lt;/li&gt;
&lt;li&gt;橡皮线中黑色或绿、黄双色线作为接地线，与电气设备相连接的接地或接零线截面最小不能低于2.50mm^2多股芯线；手持式民用电设备应采用不小于1.50mm^2的多股铜芯线。&lt;/li&gt;
&lt;li&gt;电杆转角、终端杆及总箱、分配电箱必须有重复接地。&lt;/li&gt;
&lt;li&gt;高层配电箱重设接地，必须从地下引入。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（六）变配电装置&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;高压露天变压器间的面积不应小于3m×3m，围墙高度不应低于3.50m，地平整无杂草，金属门应向外开启并接地，配有安全警告标牌，室外有散水坡。&lt;/li&gt;
&lt;li&gt;配电间面积不应小于3m×3m，单列配电柜（板）通道，正面不小于1.5m，侧面不小于1m，背面不小于0.8m，双列配电柜正面不小于2m。&lt;/li&gt;
&lt;li&gt;配电间必须符合“四防一通”的要求。&lt;/li&gt;
&lt;li&gt;变配电间应配有安全防护用品和消防器材，并有各类警告标牌。开关应有编号及用途标记，保持室内清洁无杂物。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5-15 机具设备&lt;/h3&gt;
&lt;h4&gt;（一）强制式搅拌机及砂浆机&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;必须搭设防雨操作棚，机体安装坚实平稳。&lt;/li&gt;
&lt;li&gt;各类离合器、制动器、钢丝绳、防护罩必须安全有效。&lt;/li&gt;
&lt;li&gt;操作人员应持证上岗操作。&lt;/li&gt;
&lt;li&gt;须有良好的单独接地，接地电阻应符合规定。&lt;/li&gt;
&lt;li&gt;强制式搅拌机操作杆须有保险装置，进料斗有挂钩及链。&lt;/li&gt;
&lt;li&gt;强制式搅拌机拉铲必须使用安全电压。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（二）木工平（压）刨&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;外露传动部位必须装有防护装置，刨面必须有靠山。&lt;/li&gt;
&lt;li&gt;平刨刀刃处必须设护手防护装置。&lt;/li&gt;
&lt;li&gt;压刨设有刀口防回弹装置，必须单独接地或接零保护。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（三）木工圆锯&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;传动部位必须有防护罩和安全防护挡板及月牙罩。&lt;/li&gt;
&lt;li&gt;圆锯要设松口刀，操作必须使用单向电动开关。&lt;/li&gt;
&lt;li&gt;要有良好的接地保护，并安装漏电保护器。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（四）手持电动机具&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;必须单独安装漏电保护器，防护罩壳齐全有效。&lt;/li&gt;
&lt;li&gt;外壳必须有效接地或接零，橡皮电线不得破损。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（五）电焊机&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;有可靠的防雨措施，一、二次线（电源、龙头）接线处应有齐全的防护罩，二次线应使用线鼻子。&lt;/li&gt;
&lt;li&gt;有良好的接地或接零保护，配线不得乱拉乱搭，焊把绝缘良好。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（六）乙炔发生器&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;距明火应大于10m。必须装有回火防止器。&lt;/li&gt;
&lt;li&gt;应有保险链防爆膜，保险装置灵敏可靠，使用合理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（七）气瓶&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;各类气瓶应有明显的色标和防震器，不得在露天曝晒。&lt;/li&gt;
&lt;li&gt;乙炔气瓶与氧气瓶距离应大于5m。皮管应用夹头紧固。&lt;/li&gt;
&lt;li&gt;乙炔气瓶在使用时必须装回火防止器。&lt;/li&gt;
&lt;li&gt;操作人员应持有效证上岗操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;（八）水泵&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;电源线不得破损，有良好的接零保护装置。&lt;/li&gt;
&lt;li&gt;应单独安装漏电保护器，灵敏可靠。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5-16 防火安全&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;建立防火责任制，职责明确。按规定设专职防火干部和专职消防员，建立防火档案并正确填写。&lt;/li&gt;
&lt;li&gt;建立义务消防队，专人负责，订出教育训练计划和管理办法。&lt;/li&gt;
&lt;li&gt;重点部位（危险仓库、油漆间、木库、木工间等）必须建立有关部门规定，有专人管理，责任落实，设置警告标志，配置相应的消防器材。&lt;/li&gt;
&lt;li&gt;建立动用明火审批制，划分级别，明确审批手续，并有监护措施。&lt;/li&gt;
&lt;li&gt;一般建筑各层，非重点仓库及宿舍，明确用火审批手续，并有监护措施。&lt;/li&gt;
&lt;li&gt;焊割作业应严格执行“十不烧”及压力容器使用规定。&lt;/li&gt;
&lt;li&gt;危险品押送人员、仓库管理人员和特殊工种必须经培训和审证，做到持有效证上岗。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;六、文明施工现场措施&lt;/h2&gt;
&lt;p&gt;施工现场是反映企业形象的窗口，体现着项目管理水平的高低。其文明程度极大地影响着工程项目的成本、质量与安全情况的好坏，为确保该工程现场文明施工，拟采取以下措施：&lt;/p&gt;
&lt;h3&gt;6-1 场容场貌&lt;/h3&gt;
&lt;p&gt;6-1-1 施工现场用实行封闭施工，隔断高度、色彩符合综合考评要求，并配以标语和图案。&lt;/p&gt;
&lt;p&gt;6-1-2 在现场总出入口设置“五牌一图”，并设门卫，严禁非工作人员擅自进入施工现场。现场划分明确的施工区域和办公区域，并划分责任区，设标志牌，分片包干到人。&lt;/p&gt;
&lt;p&gt;6-1-3 各类原材料，构件及半成品按施工平面图进行合理布置，要求堆放整齐，施工道路场通，使用方便，并相应做好防雨、防潮等措施。&lt;/p&gt;
&lt;p&gt;6-1-4 施工现场主要道路做砼固化路面，并派专人清扫，保证路面清洁。&lt;/p&gt;
&lt;p&gt;6-1-5 工程周边设排水沟、集水井、施工用水和生活用水经沉淀池沉渣处理后排入下水道，生活垃圾派专人清扫送至垃圾站，不得污染现场周边的清洁卫生。&lt;/p&gt;
&lt;h3&gt;6-2 场地、料具管理&lt;/h3&gt;
&lt;p&gt;6-2-1 施工现场各种料具须按施工平面图指定的位置进行堆放，并分规格按要求堆放整齐、稳固，做到一头齐，一条线，堆放散料时进行围档，材料堆放不得影响交通。&lt;/p&gt;
&lt;p&gt;6-2-2 钢筋按规格分别搁置整齐，并挂设产品标识牌，加工的产品应分门别类搁置在物架上。&lt;/p&gt;
&lt;p&gt;6-2-3 施工机械进场必须经安全检查，有记录，检查合格后方可使用。&lt;/p&gt;
&lt;p&gt;6-2-4 切割机，磨边机等机械应搭设临时操作棚，操作棚内稳固整洁，每天使用后的机具应清洗干净做好日常保养。闲置设备应保养好入库。&lt;/p&gt;
&lt;p&gt;6-2-5 工人操作时应做到活完料净脚下清，砂浆、砼倒运应采取防护措施，严禁材料乱放，要节约材料。&lt;/p&gt;
&lt;p&gt;6-2-6 搅拌站前设污水沉淀池，其污水经沉淀排入院内下水道。&lt;/p&gt;
&lt;h3&gt;6-3 环境卫生&lt;/h3&gt;
&lt;p&gt;6-3-1 施工现场设置垃圾站，及时集中分拣、回收利用、清运。垃圾清运出场必须倒到指定的场所，严禁乱倒乱卸。&lt;/p&gt;
&lt;p&gt;6-3-2 搅拌站和易飞扬的细散颗粒材料应采取降尘措施。杜绝扬尘。&lt;/p&gt;
&lt;p&gt;6-3-3 办公室做到整洁、清爽，各类图表、岗位责任制悬挂整齐且字迹工整；图纸、资料、往来资料专人保管，各类档案分类明确，编号存放。&lt;/p&gt;
&lt;p&gt;6-3-4 施工现场须设有茶水亭和茶水桶，做到有盖加配怀子，有消毒设备。&lt;/p&gt;
&lt;p&gt;6-3-5 工地设水冲式男女厕所，落实专人管理，保持清洁无害。&lt;/p&gt;
&lt;p&gt;6-3-6 工地设简易浴室，保证供水，保持清洁。现场落实消灭蚊蝇孳生承包措施。&lt;/p&gt;
&lt;p&gt;6-3-7 生活垃圾随时处理或集中加以遮挡，妥善处理，保持场容整洁。&lt;/p&gt;
&lt;h3&gt;6-4 综合治理&lt;/h3&gt;
&lt;p&gt;6-4-1 施工现场必须按照“谁管谁负责”的原则安排治安保卫工作，配备一名专职保卫人员负责现场保卫工作。&lt;/p&gt;
&lt;p&gt;6-4-2 进入施工现场须遵守各项规章制度，要求着装整齐，文明，不准穿拖鞋，不准打赤脚，不准大声喧哗，不准打架斗殴，破坏花草树木，对不听劝阻的一律清退出场。&lt;/p&gt;
&lt;p&gt;6-4-3 经常对职工进行文明施工教育。丰富职工业余生活，保障后勤供给，开展各种有益活动，使员工保持身心健康，以充沛的精力投入生产。&lt;/p&gt;
&lt;p&gt;6-4-4 搞好文明宣传工作，设立文明宣传栏，提倡文明礼貌用语。&lt;/p&gt;
&lt;p&gt;6-4-5 与甲方共建文明施工现场，经常与甲方各部门保持联系，做到文明待客，礼貌待人，按甲方的要求进行标准化施工。&lt;/p&gt;
&lt;p&gt;6-4-6 施工管理人员一律戴红色安全帽，生产班组人员一律戴黄色安全帽，电工及机械操作人员一律戴蓝色安全帽。施工管理人员挂牌上岗。&lt;/p&gt;
&lt;p&gt;6-4-7 施工中按照施工顺序，编制周密的计划，组织合理的流水作业和均衡施工。设置兼职施工现场平面管理员，督促、检查、指导现场平面管理和文明施工工作。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;七、劳动力安排计划&lt;/h2&gt;
&lt;p&gt;详见下表，各种劳动力应提前落实，提前作好安排，在各分项工程施工前作好交底，按网络进度计划组织进场，除春节以外的其余节假日均应留足劳动力，应采取高薪制按劳动法结予施工人员应有的待遇，使工程施工连续进行，不至于影响工期。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;工种&lt;/th&gt;
&lt;th&gt;人数&lt;/th&gt;
&lt;th&gt;进场时间&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;副工&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;泥工&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;木工&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;水电工&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;架子工&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;机械维修工&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;电焊工&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;计量工&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;机械操作工&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;杂工&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;防水工&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;油漆工&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;汽车司机&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;按进度要求进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;管理人员&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;开工进场&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;八、主要材料、构件使用计划&lt;/h2&gt;
&lt;p&gt;主要材料数量按下表供货，进场数量按计划提前组织进场。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;材料名称&lt;/th&gt;
&lt;th&gt;单位&lt;/th&gt;
&lt;th&gt;用量&lt;/th&gt;
&lt;th&gt;提前进场时间&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;水泥 425&lt;/td&gt;
&lt;td&gt;公斤&lt;/td&gt;
&lt;td&gt;415800&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;白水泥&lt;/td&gt;
&lt;td&gt;公斤&lt;/td&gt;
&lt;td&gt;19580&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;粗 净 砂&lt;/td&gt;
&lt;td&gt;M^3&lt;/td&gt;
&lt;td&gt;696&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;杉 元 条&lt;/td&gt;
&lt;td&gt;M^3&lt;/td&gt;
&lt;td&gt;24.4&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;松 元 木&lt;/td&gt;
&lt;td&gt;M^3&lt;/td&gt;
&lt;td&gt;11.4&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;300×300地面砖&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;2585&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;1000×1000地面砖&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;333.5&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;500×500防静电地板&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;27.5&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;进口地毯&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;11240&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;地毯胶垫&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;12158&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;进口墙纸&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;25698&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;胡桃木夹板&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;1162&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;实木板&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;6080&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;进口五夹板&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;1696&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;进口九夹板&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;2506&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;进口大芯板&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;6023&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;300×300墙面砖&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;8066&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;120木阴角线&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;10256&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;石膏板厚12mm&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;10186&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;U型轻钢龙骨h＝45&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;15680&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;U型轻钢龙骨h＝19&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;32640&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;T型铝合金龙骨h＝45&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;2535&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;T型铝合金龙骨h＝19&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;2535&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;镜面玻璃&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;496&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;角钢&lt;/td&gt;
&lt;td&gt;kg&lt;/td&gt;
&lt;td&gt;6958&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;防锈漆&lt;/td&gt;
&lt;td&gt;kg&lt;/td&gt;
&lt;td&gt;3958&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;进口清漆&lt;/td&gt;
&lt;td&gt;kg&lt;/td&gt;
&lt;td&gt;1968&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;进口乳胶漆&lt;/td&gt;
&lt;td&gt;kg&lt;/td&gt;
&lt;td&gt;5576&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;L型门锁&lt;/td&gt;
&lt;td&gt;把&lt;/td&gt;
&lt;td&gt;608&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;门碰珠&lt;/td&gt;
&lt;td&gt;个&lt;/td&gt;
&lt;td&gt;960&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;闭门器&lt;/td&gt;
&lt;td&gt;个&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;脚手架焊接钢管&lt;/td&gt;
&lt;td&gt;公斤&lt;/td&gt;
&lt;td&gt;63896&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;平板玻璃12mm&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;进口羊毛地毯&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;500×500地面砖&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;185&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;西米黄大理石&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;712&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;挪威米黄大理石&lt;/td&gt;
&lt;td&gt;M^2&lt;/td&gt;
&lt;td&gt;2068&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;不锈钢楼梯栏杆&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;367&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;带喷头浴缸&lt;/td&gt;
&lt;td&gt;套&lt;/td&gt;
&lt;td&gt;305&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;进口豪华冲浪浴缸&lt;/td&gt;
&lt;td&gt;套&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;座式大便器&lt;/td&gt;
&lt;td&gt;套&lt;/td&gt;
&lt;td&gt;305&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;带转换龙头洗脸盆&lt;/td&gt;
&lt;td&gt;套&lt;/td&gt;
&lt;td&gt;305&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;净身盆&lt;/td&gt;
&lt;td&gt;套&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;椭圆形浴缸&lt;/td&gt;
&lt;td&gt;套&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;整体淋浴房&lt;/td&gt;
&lt;td&gt;套&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;轴流换气扇&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;305&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;大花灯&lt;/td&gt;
&lt;td&gt;套&lt;/td&gt;
&lt;td&gt;612&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;壁灯&lt;/td&gt;
&lt;td&gt;套&lt;/td&gt;
&lt;td&gt;608&lt;/td&gt;
&lt;td&gt;按施工进度进场&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;九、主要机具使用计划&lt;/h2&gt;
&lt;p&gt;本工程中所用的小型设备均由项目部已有或从公司总部调集，进场前进行严格的安全性能和使用性能检查，具体计划如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;机械或设备名称&lt;/th&gt;
&lt;th&gt;型号规格&lt;/th&gt;
&lt;th&gt;数量&lt;/th&gt;
&lt;th&gt;额定功率KW&lt;/th&gt;
&lt;th&gt;生产能力&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;石材切割机&lt;/td&gt;
&lt;td&gt;900&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;石材切割机&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;石材磨边机&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;弯曲机&lt;/td&gt;
&lt;td&gt;GW4-40&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;断料机&lt;/td&gt;
&lt;td&gt;GK3-60&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;直流电焊机&lt;/td&gt;
&lt;td&gt;BX330&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4.5&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;小型切割机&lt;/td&gt;
&lt;td&gt;GJ4-40&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;3.5&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;小型切割机&lt;/td&gt;
&lt;td&gt;GJ4-20&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;3.5&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;电动空压机&lt;/td&gt;
&lt;td&gt;0.6m^3/min&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;电动空压机&lt;/td&gt;
&lt;td&gt;1m^3/min&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;电动空压机&lt;/td&gt;
&lt;td&gt;3m^3/min&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5.5&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;国产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;柴油发电机&lt;/td&gt;
&lt;td&gt;FL-200&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;良好&lt;/td&gt;
&lt;td&gt;仅停电时使用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;            </description>
            <pubDate>2026-05-14 05:08:58</pubDate>
            <link>https://www.syuez.com/blog/%E5%A4%A7%E9%85%92%E5%BA%97%E5%AE%A4%E5%86%85%E8%A3%85%E4%BF%AE%E5%B7%A5%E7%A8%8B%E6%96%BD%E5%B7%A5%E7%BB%84%E7%BB%87%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%A4%A7%E9%85%92%E5%BA%97%E5%AE%A4%E5%86%85%E8%A3%85%E4%BF%AE%E5%B7%A5%E7%A8%8B%E6%96%BD%E5%B7%A5%E7%BB%84%E7%BB%87%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88.html</guid>
                                               <category>设计方案</category>
                                    </item>
                <item>
            <title>Netty之ByteBuf</title>
            <description>
            &lt;!--
author: admin
date: 2023-01-28
title: Netty之ByteBuf
tags: Netty,ByteBuf,基本数据类型
category: java
status: publish
summary: 学习Netty
--&gt;
&lt;h1&gt;Netty之ByteBuf&lt;/h1&gt;
&lt;p&gt;先放一段代码&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package com.syuez;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;

public class ByteBufTest {
    public static void main(String[] args) {
        ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(9, 100);
        print(&quot;allocate ByteBuf(9, 100)&quot;, buffer);

        // write 方法改变写指针，写完之后写指针未到 capacity 的时候，buffer 仍可写。
        buffer.writeBytes(new byte[]{1,2,3,4});
        print(&quot;writeBytes(1,2,3,4)&quot;, buffer);

        // write 方法改变写指针，写完之后写指针未到 capacity 的时候，buffer 仍然可写，
        // 写完 int 类型之后，写指针增加 4 。
        buffer.writeInt(12); // java 中 int 占 4个字节
        print(&quot;writeInt(12)&quot;, buffer);

        // write 改变写指针，写完之后写指针等于 capacity 的时候，buffer 不可写。
        buffer.writeBytes(new byte[]{5});
        print(&quot;writeBytes(5)&quot;, buffer);

        // write 方法改变写指针，写的时候发现 buffer 不可写则开始扩容，扩容之后 capacity 随即改变。
        buffer.writeBytes(new byte[]{6});
        print(&quot;writeBytes(6)&quot;, buffer);

        // get 方法不改变读指针
        System.out.println(&quot;getByte(3) return: &quot; + buffer.getByte(3));
        System.out.println(&quot;getShort(3) return: &quot; + buffer.getShort(3));
        System.out.println(&quot;getInt(3) return: &quot; + buffer.getInt(3));
        print(&quot;getByte()&quot;, buffer);

        // set 方法不改变读写指针
        buffer.setByte(buffer.readableBytes() + 1, 0);
        print(&quot;setByte()&quot;, buffer);

        // read 方法改变读指针
        byte[] dst = new byte[buffer.readableBytes()];
        buffer.readBytes(dst);
        print(&quot;readBytes(&quot; + dst.length + &quot;)&quot;, buffer);
    }

    private static void print(String action, ByteBuf buffer) {
        System.out.println(&quot;after ===========&quot; + action + &quot;============&quot;);
        System.out.println(&quot;容量 —— capacity(): &quot; + buffer.capacity());
        System.out.println(&quot;最大容量 —— maxCapacity(): &quot; + buffer.maxCapacity());
        System.out.println(&quot;读指针位置 —— readerIndex(): &quot; + buffer.readerIndex());
        System.out.println(&quot;可读字节数 —— readableBytes(): &quot; + buffer.readableBytes());
        System.out.println(&quot;是否可读 —— isReadable(): &quot; + buffer.isReadable());
        System.out.println(&quot;写指针位置 —— writerIndex(): &quot; + buffer.writerIndex());
        System.out.println(&quot;可写字节数 —— writableBytes(): &quot; + buffer.writableBytes());
        System.out.println(&quot;是否可写 —— isWritable(): &quot; + buffer.isWritable());
        System.out.println(&quot;可写最大字节数 —— maxWritableBytes(): &quot; + buffer.maxWritableBytes());
        System.out.println();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ByteBuf 的结构：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/1650817a1455afbb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ByteBuf 是一个字节容器，也就是说字节是 ByteBuf 中的最小单位，指针每移动1个单位就是读取1字节的数据。&lt;/p&gt;
&lt;p&gt;在上面的代码中有&lt;code&gt;getByte(3)&lt;/code&gt;、&lt;code&gt;getShort(3)&lt;/code&gt;、&lt;code&gt;getInt(3)&lt;/code&gt;三个函数，它们的输出分别如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;getByte(3) return: 4
getShort(3) return: 1024
getInt(3) return: 67108864&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一次看的时候我有些懵逼，除了知道4是怎么来的，剩下两个不知道是如何计算的。后来研究了一下，算是明白一点了。&lt;/p&gt;
&lt;p&gt;首先看&lt;code&gt;new byte[]{1,2,3,4}&lt;/code&gt;，这是一个 byte 数组，刚开始我以为这里的1，2，3，4 是普通的数字(int)，在 Java 中 int 占4个字节，而这里的1，2，3，4是 byte 类型，只占1个字节。&lt;code&gt;byte[]{1,2,3,4}&lt;/code&gt;和&lt;code&gt;int[]{1,2,3,4}&lt;/code&gt;完全是不一样的东西，真的是&lt;em&gt;基础不牢，地动山摇&lt;/em&gt;。&lt;/p&gt;
&lt;p&gt;上面的代码中，总共向 buffer 写入了4次数据：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;buffer.writeBytes(new byte[]{1, 2, 3, 4});
buffer.writeInt(12);
buffer.writeBytes(new byte[]{5});
buffer.writeBytes(new byte[]{6});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;除了12是 int 占4个字节，其他都只占1个字节。把 buffer 中的数据以二进制&lt;code&gt;1&lt;/code&gt;和&lt;code&gt;0&lt;/code&gt;表示一下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/B2xgeX3vofGnbI79HsMPHT79EQVlAh3EYp7Nxi3aYpdGxYk.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;用老款的Window计算器看下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e0330bc6-e0f2-47a7-ad9f-6c0f999f3be8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;左下角有字节、字、双字和四字，这里说下，八个比特(Bit)称为一个字节（Byte），两个字节称为一个字（Word），两个字称为一个双字（Dword），两个双字称为一个四字（Qword）。这里容易弄混。&lt;/p&gt;
&lt;p&gt;int 12 是4字节，也就是双字：&lt;code&gt;0000 0000 0000 0000 0000 0000 0000 0001&lt;/code&gt;，其他都是1字节的。&lt;/p&gt;
&lt;p&gt;那么图片上就是 buffer 的二进制bit表示了。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;getByte(3)&lt;/code&gt;就是索引3的位置开始，1个字节长度的数据&lt;code&gt;0000 0100&lt;/code&gt;，也就是4。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;getShort(3)&lt;/code&gt;就是索引3的位置开始，2个字节长度的数据(Java中short占2个字节)&lt;code&gt;0000 0100 0000 0000&lt;/code&gt;，就是1024。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;getInt(3)&lt;/code&gt;就是索引3的位置开始，4个字节长度的数据&lt;code&gt;0000 0100 0000 0000 0000 0000 0000 0000&lt;/code&gt;，就是67108864。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文代码部分摘自《跟闪电侠学Netty》第7章&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Netty%E4%B9%8BByteBuf.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Netty%E4%B9%8BByteBuf.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>档案管理项目人员职责</title>
            <description>
            &lt;!--
author: admin
date: 2023-01-13
title: 档案管理项目人员职责
tags: 档案
category: 项目管理
status: publish
summary: 软考中项
--&gt;
&lt;h1&gt;档案管理项目人员职责&lt;/h1&gt;
&lt;h2&gt;一、项目负责人&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;负责现场的人员管理和数字化加工管理&lt;/li&gt;
&lt;li&gt;负责把控项目的进度和其他突发状况&lt;/li&gt;
&lt;li&gt;负责向招标人汇报项目进度和协调工作&lt;/li&gt;
&lt;li&gt;负责项目保密协议实施工作和其余安全管理工作&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;二、技术服务人员&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;负责各类档案的登记以及档案的整理，检查档案中的文件名、页面、页数，如有不规范的文件名、页面、页数，我司会进行修改后再录入计算机&lt;/li&gt;
&lt;li&gt;负责将档案卷内目录及其它索引信息进行手工录入为电子数据信息并校对&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;三、数字化加工人员&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;负责使用扫描设备对整理完毕的档案逐页进行数字化扫描，根据档案类型设置相应技术参数，确保图像完整、清晰、无遗漏&lt;/li&gt;
&lt;li&gt;负责对扫描生成的图像进行命名、格式转换和初步分类存储，做好扫描数据的原始备份&lt;/li&gt;
&lt;li&gt;负责扫描设备的日常维护和故障报修，保障数字化加工任务的连续开展&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;四、质量管理员&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;负责制定项目各阶段的质量检查标准与抽检方案，监督档案整理、录入、扫描等工作的规范执行&lt;/li&gt;
&lt;li&gt;负责对档案数据成果进行逐项或抽样检查，包括目录录入准确性、图像清晰度、文件挂接正确性等，形成质检记录并跟踪整改闭环&lt;/li&gt;
&lt;li&gt;负责向项目负责人提交质量分析报告，协助完善作业流程，持续提升整体交付质量&lt;/li&gt;
&lt;/ul&gt;            </description>
            <pubDate>2026-05-13 08:07:37</pubDate>
            <link>https://www.syuez.com/blog/%E6%A1%A3%E6%A1%88%E7%AE%A1%E7%90%86%E9%A1%B9%E7%9B%AE%E4%BA%BA%E5%91%98%E8%81%8C%E8%B4%A3.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E6%A1%A3%E6%A1%88%E7%AE%A1%E7%90%86%E9%A1%B9%E7%9B%AE%E4%BA%BA%E5%91%98%E8%81%8C%E8%B4%A3.html</guid>
                                               <category>项目管理</category>
                                    </item>
                <item>
            <title>绿化工程投标书模板2</title>
            <description>
            &lt;!--
author: admin
date: 2023-01-10
title: 绿化工程投标书模板2
tags: 绿化
category: 招投标
status: publish
summary: 招投标~
--&gt;
&lt;h1&gt;投 标 文 件&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;（正本）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项 目编 号：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项 目名 称：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;所 投标 段：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;供应商名称：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;地 址：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;电 话：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;传 真：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;投 标日 期：&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;第一部分 商务部分&lt;/h2&gt;
&lt;h3&gt;一、法定代表人身份证明书&lt;/h3&gt;
&lt;p&gt;单位名称：&lt;/p&gt;
&lt;p&gt;单位性质：&lt;/p&gt;
&lt;p&gt;地 址：&lt;/p&gt;
&lt;p&gt;成立时间： 年 月 日&lt;/p&gt;
&lt;p&gt;经营期限：&lt;/p&gt;
&lt;p&gt;姓名： 性别： 年龄： 职务：&lt;/p&gt;
&lt;p&gt;系 的法定代表人。&lt;/p&gt;
&lt;p&gt;特此证明。&lt;/p&gt;
&lt;p&gt;投标单位： [（盖章）]{.underline}&lt;/p&gt;
&lt;p&gt;日 期： 年 月 日&lt;/p&gt;
&lt;h3&gt;2. 投标文件签署授权委托书&lt;/h3&gt;
&lt;p&gt;我 &lt;strong&gt;[张高潮]{.underline}&lt;/strong&gt; 系 &lt;strong&gt;[（投标单位全称）]{.underline}&lt;/strong&gt; 的法定代表人现授权委托我公司 （职务或职称） （姓名）为全权代表，参加 （采购方名称）的 （项目名称），项目编号为： ，该同志代表我单位全权处理本次招标活动中与 （采购人）的一切事宜，由他签字的一切文件，我公司均认可。&lt;/p&gt;
&lt;p&gt;代理人无转委托权，特此委托。&lt;/p&gt;
&lt;p&gt;代理人：[（签字）]{.underline} 性别： 年龄：&lt;/p&gt;
&lt;p&gt;身份证号码： 职务：&lt;/p&gt;
&lt;p&gt;单位名称： [（盖章）]{.underline}&lt;/p&gt;
&lt;p&gt;法定代表人： [（签字或盖章）]{.underline}&lt;/p&gt;
&lt;p&gt;授权委托日期： 年 月 日&lt;/p&gt;
&lt;h3&gt;三、报价函&lt;/h3&gt;
&lt;p&gt;致：&lt;/p&gt;
&lt;p&gt;1、根据已收到贵方的项目编号为 的 工程招标文件，遵照《中华人民共和国招标投标法》、《中华人民共和国政府采购法》等有关规定，我单位经考察现场和研究上述工程招标文件的投标须知、合同条款、工程量清单和其他有关文件后，我方愿以（[币种、金额、单位）]{.underline}、[（小写）]{.underline}的报价并按投标文件的要求承包本次工程项目的材料采购、施工、竣工，并承担任何质量缺陷保修责任。&lt;/p&gt;
&lt;p&gt;2、我方已详细审核全部招标文件，包括答疑、修改文件及有关附件。&lt;/p&gt;
&lt;p&gt;3、一旦我方中标，我方保证按合同协议书中规定的工期 日历天内完成并移交全部工程。&lt;/p&gt;
&lt;p&gt;4、我单位保证本工程质量达到 标准。&lt;/p&gt;
&lt;p&gt;5、我方同意所递交的投标文件在招标文件中规定的投标有效期内有效，在此期间内我方如中标，我方将受此约束。&lt;/p&gt;
&lt;p&gt;6、贵方的中标通知书和本投标文件将构成约束我们双方合同文件的组成部分。&lt;/p&gt;
&lt;p&gt;7、我方将与本报价函一起，提交[（币种、金额、单位）]{.underline}作为投标保证金。&lt;/p&gt;
&lt;p&gt;投标单位： [（盖法人章）]{.underline}&lt;/p&gt;
&lt;p&gt;单位地址：&lt;/p&gt;
&lt;p&gt;法定代表人或授权委托代理人： [（签字或盖章）]{.underline}&lt;/p&gt;
&lt;p&gt;邮政编码： 电话： 传真：&lt;/p&gt;
&lt;p&gt;开户银行名称： 开户银行账号：&lt;/p&gt;
&lt;p&gt;日期： 年 月 日&lt;/p&gt;
&lt;h3&gt;四、唱价一览表&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;项目内容&lt;/th&gt;
&lt;th&gt;投保内容&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;第一标段&lt;/td&gt;
&lt;td&gt;第二标段&lt;/td&gt;
&lt;td&gt;第三标段&lt;/td&gt;
&lt;td&gt;第四标段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;总报价（万元）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;施工总工期（合同签订，甲方下达开工通知后天）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;质量标准&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;负责项目的注册建造师&lt;/td&gt;
&lt;td&gt;姓名&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;资质等级&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;优惠条件（价格除外）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;备注&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标单位代表（签字）：&lt;/p&gt;
&lt;p&gt;投标单位（盖章）：&lt;/p&gt;
&lt;p&gt;日 期： 年 月 日&lt;/p&gt;
&lt;h3&gt;五、工程报价说明&lt;/h3&gt;
&lt;p&gt;1、本报价依据本工程投标须知和合同文件的有关条款进行编制。&lt;/p&gt;
&lt;p&gt;2、工程量清单报价书。&lt;/p&gt;
&lt;p&gt;3、综合单价应包括为完成工程量清单项目，每计量单位工程量所需的人工费、材料费、施工机械使用费、管理费、利润、措施费、税金等所有费用，并考虑材料价格的市场风险。&lt;/p&gt;
&lt;p&gt;4、本报价中没有填写的项目的费用，视为已包括在其他项目之中。&lt;/p&gt;
&lt;p&gt;5、本报价的币种为 [人民币]{.underline} 。&lt;/p&gt;
&lt;p&gt;6、投标单位应将报价需要说明的事项，用文字书写与报价表一并报送。&lt;/p&gt;
&lt;h3&gt;六、（ 标段）报价表&lt;/h3&gt;
&lt;p&gt;工程名称：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;项目编号&lt;/th&gt;
&lt;th&gt;项目名称&lt;/th&gt;
&lt;th&gt;单位&lt;/th&gt;
&lt;th&gt;工程量&lt;/th&gt;
&lt;th&gt;综合单价&lt;/th&gt;
&lt;th&gt;小计&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合计&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注：1、综合单价应包括为完成工程量清单项目，每计量单位工程量所需的人工费、材料费、施工机械使用费、管理费、利润、措施费、税金等所有费用，并考虑材料价格的市场风险。&lt;/p&gt;
&lt;p&gt;2、投标单位必须按照此格式进行报价，不接受其他形式的报价。&lt;/p&gt;
&lt;h3&gt;7. 主要材料清单报价表&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;编号&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;规格编号&lt;/th&gt;
&lt;th&gt;单位&lt;/th&gt;
&lt;th&gt;数量&lt;/th&gt;
&lt;th&gt;综合单价&lt;/th&gt;
&lt;th&gt;合价&lt;/th&gt;
&lt;th&gt;产地品牌&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合计&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;八、报价单位概况表&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;企业注册名称&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;企业注册地址&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;主管部门&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;经营范围&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;企业资质等级&lt;/td&gt;
&lt;td&gt;叁级&lt;/td&gt;
&lt;td&gt;经营方式&lt;/td&gt;
&lt;td&gt;私营&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;成立时间&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;批准部门&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;批准文号&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;企业性质&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;企业法定代表人&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;注册资金（万元）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;电话&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;开户银行及账号&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;电挂&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;传真&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;职工概况&lt;/td&gt;
&lt;td&gt;职工总数&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;其中：技术人员数&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;高级工程师&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;工程师&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;助理工程师&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;技术员&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单位行政和技术负责人&lt;/td&gt;
&lt;td&gt;姓名&lt;/td&gt;
&lt;td&gt;职务及职称&lt;/td&gt;
&lt;td&gt;年龄&lt;/td&gt;
&lt;td&gt;专业&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单位概况：聊城市润华园林工程有限公司是具有独立法人资格，由市建委批准的并持有资质证书的责任企业，主要承接花木种植销售；园林工程设计施工养护；园林小品、城市雕塑制作；花卉园艺技术服务等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单 位：（盖章）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;法定代表人：（签字、盖章）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;第二部分 技术部分&lt;/h2&gt;
&lt;h3&gt;一、各分部分项工程的主要施工方法&lt;/h3&gt;
&lt;h3&gt;二、拟投入的主要施工机械设备情况、主要施工机械进场计划&lt;/h3&gt;
&lt;h4&gt;（一）拟投入的主要施工机械设备表&lt;/h4&gt;
&lt;p&gt;[（工程项目名称）]{.underline} 工程 共 页 第 页&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;机械或设备名称&lt;/th&gt;
&lt;th&gt;型号规格&lt;/th&gt;
&lt;th&gt;数量&lt;/th&gt;
&lt;th&gt;国别产地&lt;/th&gt;
&lt;th&gt;制造年份&lt;/th&gt;
&lt;th&gt;额定功率（KW）&lt;/th&gt;
&lt;th&gt;生产能力&lt;/th&gt;
&lt;th&gt;用于施工部分&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;（二）主要施工机械进场计划&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;机械或设备名称&lt;/th&gt;
&lt;th&gt;型号规格&lt;/th&gt;
&lt;th&gt;数量&lt;/th&gt;
&lt;th&gt;进场时间&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;三、劳动力计划表&lt;/h3&gt;
&lt;p&gt;[（工程项目名称）]{.underline} 工程 共 页 第 页&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工种&lt;/th&gt;
&lt;th&gt;按工程施工阶段投入劳动力情况&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注：1、投标单位应按所列格式提交包括的估计劳动力计划表。&lt;/p&gt;
&lt;p&gt;2、本计划表是以每八小时工作制为基础编制的。&lt;/p&gt;
&lt;h3&gt;四、确保工程质量技术组织措施&lt;/h3&gt;
&lt;h4&gt;一、质量目标：&lt;/h4&gt;
&lt;p&gt;我公司保证本工程质量达以&amp;quot;合格&amp;quot;标准。&lt;/p&gt;
&lt;h4&gt;二、对自报质量等级有奖措施：&lt;/h4&gt;
&lt;p&gt;我公司承诺对工程若达不到自报质量标准等级，按合同规定接受业主罚款。&lt;/p&gt;
&lt;h4&gt;三、施工阶段质量控制工作流程&lt;/h4&gt;
&lt;p&gt;1、为了实现工程的质量目标，施工过程中必须在每道工序加以控制，为了达到每道工序质量控制有效，将严格按以下&amp;quot;施工阶段质量控制工作流程图&amp;quot;进行质量控制。&lt;/p&gt;
&lt;p&gt;2、 确保质量保证措施&lt;/p&gt;
&lt;p&gt;为确保本工程质量目标的实现，我公司针对所有参加工程项目施工人员，尤其是管理人员加强质量意识、质量目标的教育宣传，牢固树立&amp;quot;质量第一&amp;quot;的意识。围绕质量工作目标，形成科学的网络化管理模式，并层层分解到各个施工环节及日常工作实物管理中去。据此，特定以下质量保证实施措施：&lt;/p&gt;
&lt;p&gt;3、质量管理措施&lt;/p&gt;
&lt;p&gt;①、一旦我公司接收现场后，我公司将及时做好业主提供的有关水准点、坐标轴控制点的复核、验收接收及保护工作，并做好有关书面资料的收集整理归档，为下道工序的施工提供可靠的技术保证。&lt;/p&gt;
&lt;p&gt;②、在展开工程施工前，对接收的施工图纸，由项目工程师组织项目部全体人员认真学习有关材料，了解甲方要求。&lt;/p&gt;
&lt;p&gt;③、现场项目部根据质量保证计划的要求，制订一个更具体的质量控制体系，明确每道工序的事前交底，中间验收及最后验收环节的要求，严格执行质量三级验收制度，及时尽早发现问题及时整改，防患于未然，确保工程中每个分项直至每个工序环节的施工质量，来保证最终的工程质量目标。&lt;/p&gt;
&lt;p&gt;④、为确保实工程质量，配备具有多年现场工作经验的管理人员进行质量管理，施工过程中加强过程工序控制，从而从提高队伍素质及加强管理水平等方面。&lt;/p&gt;
&lt;p&gt;⑤、加强施工现场管理质量管理机构设置工作，各级管理人员都必须对本岗位的质量要求明确了解，从管理体制上保证工程的施工质量。&lt;/p&gt;
&lt;p&gt;⑥、工程施工过程中，必须加强计量工作和工程施工资料的整理归档工作，在抓好工程施工的硬件的同时，必须抓好软件的管理工作，从而保证工程的施工质量。&lt;/p&gt;
&lt;p&gt;⑦建立三级验收分部分项质量评定制度。&lt;/p&gt;
&lt;p&gt;各分部分项工程施工过程中，各分管工种负责人必须督促班组做好自检工作，确保当天问题当天整改完毕。&lt;/p&gt;
&lt;p&gt;分项工程施工完毕后，各分种负责人必须及时组织班组进行分项工程质量评定工作，并填写分项工程质量评定表交项目经理确认，最终评定表由专职质量员核定。&lt;/p&gt;
&lt;p&gt;由承包项目经理部项目经理每月应组织一次各施工班组之间的质量互检，并进行质量讲评。&lt;/p&gt;
&lt;p&gt;由公司质量部对本工程定期进行质量抽样检查和监督，发现总理以书面形式限期整改通知单，由项目经理负责在指定限期内整改，并将整改情况以书面形式反馈到公司质量部。&lt;/p&gt;
&lt;p&gt;⑷原材料质量措施&lt;/p&gt;
&lt;p&gt;①加强材料的质量控制，凡工程需用的成品、半成品等严格按质量标准采购，各类施工材料到现场后必须由项目经理和项目工程师组织有关人员进行抽样调查，发现问题及时书面通知业主，并与供货商联系，以业主批准后退货措施。&lt;/p&gt;
&lt;p&gt;②合理组织材料供应和材料使用并做好储运、保管工作，特别是对由业主指定材料供应商，在材料进场后应安排适当的堆放场地及仓贮用房，指定专人妥善保管，并协助做好原材料的二次复试取样、送样工作。&lt;/p&gt;
&lt;p&gt;③对于施工主材加强取样工作，对每批进场水泥必须取样进行安定性及强度等物理试验。对混凝土及砂浆的粗细骨料必须进行取样分析，所有材料均须取得合格的试验证明方可投入使用，坚决不在工程中使用不合格的产品。&lt;/p&gt;
&lt;p&gt;④所有材料供应部门必须提供所有所供产品的合格证，按堆积要求必须的抽样复试工作，质量管理人员对提供产品进行抽查监督，凡不符合质量标准、无合格证明的产品一律不准使用，并采取必须的封存措施，及时退场。&lt;/p&gt;
&lt;p&gt;⑸　现场计量器具管理措施&lt;/p&gt;
&lt;p&gt;①有我公司专职计量负责本工程施工所用计量器材的周期鉴定、抽检工作。&lt;/p&gt;
&lt;p&gt;②现场计量器具必须确定专人保管、专人使用，并建立使用台帐，他人不得随意动用。&lt;/p&gt;
&lt;p&gt;③所有计量器具(包括经纬仪、水准仪、钢卷尺、台秤、天平、温度计、稠度仪等)要进行校对、鉴定，损坏的计量器具必须及时申报修理调换，不得带病工作。&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;测量工程质量保证措施&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;①测量放样的控制措施&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本工程施工测量之前，应认真仔细看透图纸，并对图纸上相几何尺寸及坐标进行细致的换算和复查，特别是搞清路中心线与里程桩号的纵向偏移位置，对内业计算书设专人复核认可，并保存备查。&lt;/p&gt;
&lt;p&gt;②确保施工控制网布设精度的措施：&lt;/p&gt;
&lt;p&gt;确保施工控制点之间的边长要接近相等，以保证观测的精度，平均边长视施工具体情况而定。&lt;/p&gt;
&lt;p&gt;控制点与控制点夹角控制在30度以上120度以内，内角控制在60度左右。&lt;/p&gt;
&lt;p&gt;在设置相邻控制点时，根据施工现场实际情况，将设在通视良好、地质坚实的马路或便于保存的永久建筑场上，必要时将适当加密控制点。&lt;/p&gt;
&lt;p&gt;③确保控制点精度的措施：&lt;/p&gt;
&lt;p&gt;施工前根据业主所提供的控制点，严格按照要求的精度关规范，复测控制点与控制点间的边长及相关角度，在经工程监理复核 无误后，方能使用。&lt;/p&gt;
&lt;p&gt;根据施工现场情况，在加密控制点时，将根据精度要求计算边长及角主度的测回数，施工过程中不使用半测回。&lt;/p&gt;
&lt;p&gt;施工过程中，加密定期复测力度，及时发现误差予以调整，一旦控制点发生位移，立即上报业主和工程监理，及时复测调整或重新布置。&lt;/p&gt;
&lt;p&gt;④确保角度测量精度的措施：&lt;/p&gt;
&lt;p&gt;施工所用仪器在使用这前一定要经过质量检查，特别在测角时要均匀使用水平盘刻，度换度盘计数，并采取正、倒镜观测取其平均值，另外控制望远镜的倾斜角不宜过大，一控制在3º左右，仪器至两目标点的距离要大致相等。&lt;/p&gt;
&lt;p&gt;仪器对中误差时由于仪器对中不精确所引起的测角误差，与所测角度大小有关，而边长越短或水平角越是接近180度时，对中要求越严格，故施工中本公司测量师将会谨慎操作，确保角度测量精度。&lt;/p&gt;
&lt;p&gt;在观测水平角时尽量使标杆立直，仪器照准目标的根部，边长越短，测量使越要注意。&lt;/p&gt;
&lt;p&gt;外界影响而引起的测量误差，主要有旁折光、目标阴暗、风力、仪器在阳光下受热等影响，施工过程中将根据实际情况采取相应措施。&lt;/p&gt;
&lt;p&gt;⑤检查、复测测量桩志：&lt;/p&gt;
&lt;p&gt;查对复核建设单位所交付的桥中线位置、三角网基点及水准基点等桩志和有关测量资料，如有桩志不足、不妥、位置移动或精度与要求不符，均需进行补测、加固，并将校测结果通知建设单位及监理单位。&lt;/p&gt;
&lt;h3&gt;五、确保安全生产的技术组织措施&lt;/h3&gt;
&lt;p&gt;1、安全生产目标&lt;/p&gt;
&lt;p&gt;安全生产以现行考核指标为依据，达标率为100%，确保无重大伤亡安全事故，确保周围交通畅通。&lt;/p&gt;
&lt;p&gt;2、安全及消防保证体系&lt;/p&gt;
&lt;p&gt;(1) 安全生产实施原则&lt;/p&gt;
&lt;p&gt;A、施工现场应严格执行安全生产管理规定，健全和落实工程安全责任制，切实做好&amp;quot;安全第一&amp;quot;和&amp;quot;预防为主&amp;quot;的方针，做到安全生产和文明施工。&lt;/p&gt;
&lt;p&gt;B、所参加施工的作业人员必须经安全技术操作培训合格后方可进入现场进行施工。特殊工种必须持有操作证上岗作业，严禁无证上岗作业。各工序施工前均应由施工负责人进行书面交底。&lt;/p&gt;
&lt;p&gt;C、本工程设产专职安全员，安全员根据本工程施工特点，结合安全生制度和有关制度规定，经常进行现场检查督促整改，如发现严重的不安全情况时，有权指令停止施工，并立即报告项目经理处理后方可继续施工。&lt;/p&gt;
&lt;p&gt;(3) 测量施工安全实施措施：&lt;/p&gt;
&lt;p&gt;A、测量打桩要注意周围行人的安全，不得对面使锤。钢钎和其它工具不得随意抛掷。&lt;/p&gt;
&lt;p&gt;B、测量人员在高压线附近工作时，必须保持足够的安全距离。&lt;/p&gt;
&lt;p&gt;(4)现场内临时水电设施及机械安全实施措施&lt;/p&gt;
&lt;p&gt;①现场内架设的电线必须绝缘良好，临时水电的布置以不影响地面交通为控制原则，过路的临时管线要做好相应的醒目标牌放在道路进口处。&lt;/p&gt;
&lt;p&gt;②各种电器设备应配有专用开关，室外使用的开关、插座外装防水箱并加锁，在操作处加设绝缘垫层。&lt;/p&gt;
&lt;p&gt;③电气设备的金属外壳做接零、接地保护，但不得在统一供电系统上有的接地、有的接零。&lt;/p&gt;
&lt;p&gt;④施工现场的各种电器设备的检查维修要做停电处理，如必须带电作业时，要上报有关部门，在制定了有关措施并派专人监护后方能进行。&lt;/p&gt;
&lt;p&gt;⑤现场的配电间必须备有灭火器材和高压安全用具，非电工人员严禁进入。&lt;/p&gt;
&lt;p&gt;⑥施工现场使用高温灯具，要防止失火，并且要保证使用时1M以上的安全距离。&lt;/p&gt;
&lt;p&gt;⑦移动式电气设备要用橡胶电缆供电，并注意经常理顺，跨越道路时，做穿管保护。&lt;/p&gt;
&lt;p&gt;⑧施工现场的临时照明应用瓷夹固定，电线头牢固，并用绝缘胶带包扎，保险丝要按用负荷量装设。&lt;/p&gt;
&lt;p&gt;⑨操作人员在工作中不得擅离岗位，不得操作与操作不相符合的机械，不得将机械设备交给无本机种操作证的人员操作。&lt;/p&gt;
&lt;p&gt;⑩操作人员必须按照本机说明书规定，严格执行工作前的检查制度和工作中注意观察及工作后的检查保养制度。&lt;/p&gt;
&lt;p&gt;(5) 道路工程安全实施措施&lt;/p&gt;
&lt;p&gt;①路基压实必须在压路机前后无障碍物和人员时才能启动。变换压路机前进后退方向应待滚轮停止后进行。压路机靠近路堤留有足够的安全距离。两台以上压路机同时作业，其前后间距不得小于3CM。&lt;/p&gt;
&lt;p&gt;②振动压路机起振和停振必须在压路机走时进行，在坚硬的路面行驶，严禁振动。碾压松软路基，应先在不振动的情况下碾压1-2遍，然后在振动碾压。振动压路机的换向离合器、振起离合器和制动器的调整，必须在主离合器脱开后进行，不得在急转弯时用快档，严禁在尚未超振的情况下调节振动频率。&lt;/p&gt;
&lt;p&gt;③严禁在压路机没有熄火、轮下没有三角木支垫的情况下，进行机下检修。&lt;/p&gt;
&lt;h3&gt;六、确保文明施工的技术组织措施&lt;/h3&gt;
&lt;p&gt;1、文明施工管理目标&lt;/p&gt;
&lt;p&gt;建设文明工地。积极开展文明施工窗口达标活动，做到&amp;quot;两通三无五必须，便民利民不拢民&amp;quot;。&lt;/p&gt;
&lt;p&gt;2、文明施工管理措施。&lt;/p&gt;
&lt;p&gt;①健全管理组织：我方在施工现场建立 以项目经理为组长，工程师、施工队长、生产、技术、质量、安全、消防、保卫、材料、环保等管理人员为成员的施工现场文明管理组织。该组织的职责是检查监督我方现场施工班组的文明施工工作。&lt;/p&gt;
&lt;p&gt;②健全管理制度：&lt;/p&gt;
&lt;p&gt;A、个人岗位责任制：文明施工管理按专业、岗位分片，项目经理是我方施工现场的第一责任人，全面负责；各岗位负责人(如摊铺机长、施工班等)负责本岗所辖范围内的管理工作；施工一线人员责任分工，实行个人岗位责任制。&lt;/p&gt;
&lt;p&gt;B、经济责任制：本项目的文明施工工作将列入我公司对其单位经济承包责任制，通过检查与考核，&amp;quot;优奖劣罚&amp;quot;。&lt;/p&gt;
&lt;p&gt;C、检查制度：每月组织1-2次的综合检查，按照标准和专业，填写表格，予以公布；还以定期和随时检查，个人检查与集体检查相结合的方式；班组内部经常化自检、互检、交接检查。&lt;/p&gt;
&lt;p&gt;D、持证上岗制度：现场施工人员除&amp;quot;小工、杂工&amp;quot;外，各岗位都必须持证上岗，特别是关键，特殊岗位。其他证件，如民工的&amp;quot;务工证&amp;quot;，食堂人员的&amp;quot;健康证&amp;quot;。&lt;/p&gt;
&lt;p&gt;E会议制度：施工现场因地制宜召开文明施工会议，发现问题，分析解决问题。&lt;/p&gt;
&lt;p&gt;F、其他专业管理制度：文明施工管理是一项综合性的管理工作，因此其他专业管理制度，如机械使用、材料保管、工序操作等制度中，也都应有文明施工的内容。&lt;/p&gt;
&lt;p&gt;①健全资料管理：&lt;/p&gt;
&lt;p&gt;A、关于文明施工的法规，标准和法律等资料应齐全。&lt;/p&gt;
&lt;p&gt;B、施工组织设计(以下简称&amp;quot;施组&amp;quot;)：&amp;quot;施组&amp;quot;编写应齐全，涵盖质量、安全、环境等各个施工环节要素。&amp;quot;施组&amp;quot;要写明编制人，审批人及审批意见。如变更或补充&amp;quot;施组&amp;quot;要按规定办好手续。&lt;/p&gt;
&lt;p&gt;C、施工现场作好施工日记，并应写明文明施工的内容。&lt;/p&gt;
&lt;p&gt;D、其他文明施工自检、教育、会议，专业资料都做到齐全。&lt;/p&gt;
&lt;p&gt;3、文明施工现场管理措施&lt;/p&gt;
&lt;p&gt;⑴整理：把不需要的人、机、物及时处理&lt;/p&gt;
&lt;p&gt;①按照施工计划的安排，把施工现场的人、事、物进行调查，不需要的坚决清理出场手，如身体不适，施工技能差的人员；现场的垃圾渣土，各种多余的周围材料，报废和多余材料；职工个人生活用品等清理出场。&lt;/p&gt;
&lt;p&gt;②把作业面上暂时不需要的人事物进行清理，调整到合理位置，调出作业面，留给下道工序操作人员。&lt;/p&gt;
&lt;p&gt;③对现场人、机、物使用不合理，摆放位置不当，一旦发觉，及时调整，如模板的规格错误等。&lt;/p&gt;
&lt;p&gt;④整理目的是创造最佳的施工现场环境，增大了作业面积，而且培养了员工的良好作风，提高效率。&lt;/p&gt;
&lt;p&gt;⑵整顿所需的人、机、物定量、定位。&lt;/p&gt;
&lt;p&gt;①经过调查研究，根据施工实际情况确定施工方案和作业平面。&lt;/p&gt;
&lt;p&gt;②材料、机具摆放按图定位，做到能&amp;quot;目视化&amp;quot;，即一目了然，在某处是什么，有多少，马上知道。&lt;/p&gt;
&lt;p&gt;③根据使用频率，经常使用的离作业面近一些，不以经常用的远一些；垂直堆放的物品也力求运距最短，减少二次搬运。&lt;/p&gt;
&lt;p&gt;④整顿的目的是在施工平面布置基础上，进一步合理摆放。&lt;/p&gt;
&lt;p&gt;⑶清扫施工现场的打扫和设备的修理。&lt;/p&gt;
&lt;p&gt;①施工现场保持清洁，环境卫生，这不仅是文明施工的要求，也是施工质量的要求。&lt;/p&gt;
&lt;p&gt;②对设备的清扫，是对设备定期进行点验，维护和保养。设备一旦发生异常，马上修理。&lt;/p&gt;
&lt;p&gt;③清扫也是对整顿工作的完善，反复的清扫工作中遗漏不足，防患于未然。&lt;/p&gt;
&lt;p&gt;⑷清洁对整理、整顿、清扫之后的维护，保持完善和最佳。&lt;/p&gt;
&lt;p&gt;①狭义清洁，从个人开始，注重个人卫生和形象，从而树立起建设者良好的精神面貌，反映施工企业的整体社会形象。&lt;/p&gt;
&lt;p&gt;②广义上来说，还指施工现场空间的清洁。如进一步降低有毒气味（如石灰杨尘），噪音等污染的措施，不仅保证了施工人健康，维护周边环境和过往车辆、行人的安全。&lt;/p&gt;
&lt;p&gt;③施工人员精神上也要&amp;quot;清洁&amp;quot;，礼貌用语，诚恳待人，尊重他人。&lt;/p&gt;
&lt;p&gt;⑸素养养成良好的工作习惯，遵守纪律。&lt;/p&gt;
&lt;p&gt;贯穿于整个施工过程的重要因素是劳动者的素质。因此努力提高施工现场全体职工的素质，养成遵章守纪和文明施工习惯，这也是开展&amp;quot;5S&amp;quot;活动的核心和精髓。&lt;/p&gt;
&lt;p&gt;4、文明施工保证体系&lt;/p&gt;
&lt;p&gt;现场设置文明施工保证体系，分三级管理，做到层层把关、层层落实。&lt;/p&gt;
&lt;h3&gt;七、工期保证措施&lt;/h3&gt;
&lt;p&gt;1、将本工程列为质量、工期、安全管理重点工程，制定从管理方面实现重点倾斜，做到从劳力、材料、资金、工具供需上实现&amp;quot;五个优先&amp;quot; 的工期保证措施。&lt;/p&gt;
&lt;p&gt;2、制定详细地施工进度网络控制计划及主要分项工程阶段工种施工计划，做好施工前的工作，利用划分施工流水段，增加工作面的方法加快施工进度， 利用滚动计划管理方法及时调整分段工期计划。&lt;/p&gt;
&lt;p&gt;3、设置现场全面工期管理机构，成立工期障碍排除小组，以确保按期施工，按期完工，每个队伍设工期管理员一名。&lt;/p&gt;
&lt;p&gt;4、设立专职计划统计员，技术人员在使用前4天，提供出材料用量计划，机具用量计划，资金到位率计划， 技术人员、劳动力需用计划。&lt;/p&gt;
&lt;p&gt;5、施工期间，建设单位、施工单位随施工分段验收，做到边施工、边验收， 发现问题及时解决，把施工技术间歇控制在最小限度。&lt;/p&gt;
&lt;p&gt;6、做好后勤保障措施，施工中需要的交通、运输、机电、电力、水源、原材料、资金必须保障供应。&lt;/p&gt;
&lt;p&gt;7、设立各级工期提前奖制度，按照施工组织总设计中施工进度计划，每提前一天，奖励相应资金兑现到位。&lt;/p&gt;
&lt;p&gt;8、开展劳动竞赛，形成&amp;quot;赶、比、超&amp;quot;气氛。&lt;/p&gt;
&lt;p&gt;9、应用先进工期管理成果，吸收、消化、发展，在保证质量的基础上，尽力超前，创造新纪录。&lt;/p&gt;
&lt;h3&gt;八、计划开竣工日期和施工进度网络图&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;进度计划 项目名称&lt;/th&gt;
&lt;th&gt;1-15&lt;/th&gt;
&lt;th&gt;15-30&lt;/th&gt;
&lt;th&gt;30-45&lt;/th&gt;
&lt;th&gt;45-60&lt;/th&gt;
&lt;th&gt;60-75&lt;/th&gt;
&lt;th&gt;75-90&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 施工准备&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 处理路基&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 底层灰土&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4 面层灰土&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 铺装路面&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6 整修路肩&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7 竣工前准备工作&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;注：如我公司中标，我公司中标后将接到开工令后立即开工，保证按质按期完工。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;九、项目管理班子配备情况辅助说明&lt;/h3&gt;
&lt;h4&gt;（一）、项目管理机构配备情况表&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;职务&lt;/th&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;职称&lt;/th&gt;
&lt;th&gt;执业或职业资格证明&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;已承担完工项目情况&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;证书名称&lt;/td&gt;
&lt;td&gt;级别&lt;/td&gt;
&lt;td&gt;证号&lt;/td&gt;
&lt;td&gt;专业&lt;/td&gt;
&lt;td&gt;原服务单位&lt;/td&gt;
&lt;td&gt;项目数&lt;/td&gt;
&lt;td&gt;项目名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标单位名称（公章）：&lt;/p&gt;
&lt;p&gt;法定代表人或授权代理人签字：&lt;/p&gt;
&lt;p&gt;年 月 日&lt;/p&gt;
&lt;h4&gt;（二）项目经理简历表&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;性别&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;年龄&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;职务&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;职称&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;学历&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;参加工作时间&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;担任项目经理年限&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;注册建造师证书编号&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;在建和已完工程项目情况&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;建设单位&lt;/td&gt;
&lt;td&gt;项目名称&lt;/td&gt;
&lt;td&gt;建设规模&lt;/td&gt;
&lt;td&gt;开、竣工日期&lt;/td&gt;
&lt;td&gt;在建或已完&lt;/td&gt;
&lt;td&gt;工程质量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标单位名称（公章）：&lt;/p&gt;
&lt;p&gt;法定代表人或授权代理人签字：&lt;/p&gt;
&lt;p&gt;2011年1月10日&lt;/p&gt;
&lt;h4&gt;（三）技术负责人简历表&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;性别&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;年龄&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;职务&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;职称&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;学历&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;参加工作时间&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;担任技术负责人年限&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;在建和已完工程项目情况&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;建设单位&lt;/td&gt;
&lt;td&gt;项目名称&lt;/td&gt;
&lt;td&gt;建设规模&lt;/td&gt;
&lt;td&gt;开、竣工日期&lt;/td&gt;
&lt;td&gt;在建或已完&lt;/td&gt;
&lt;td&gt;工程质量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标单位名称（公章）：&lt;/p&gt;
&lt;p&gt;法定代表人或授权代理人签字：&lt;/p&gt;
&lt;p&gt;年 月 日&lt;/p&gt;
&lt;h4&gt;（四）人员简历表&lt;/h4&gt;
&lt;p&gt;工程名称：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;性别&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;年龄&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;职务&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;职称&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;学历&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;参加工作时间&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;担任财务负责人年限&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;会计从业证书编号&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;在建和已完工程项目情况&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;建设单位&lt;/td&gt;
&lt;td&gt;项目名称&lt;/td&gt;
&lt;td&gt;工程造价（万元）&lt;/td&gt;
&lt;td&gt;开、竣工日期&lt;/td&gt;
&lt;td&gt;在建或已完&lt;/td&gt;
&lt;td&gt;工程质量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标单位名称（公章）：&lt;/p&gt;
&lt;p&gt;法定代表人或授权代理人签字：&lt;/p&gt;
&lt;p&gt;2011年1月10日&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人员简历表&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;工程名称：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;性别&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;年龄&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;职务&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;职称&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;学历&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;参加工作时间&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;担任材料管理年限&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;助工职称证书编号&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;在建和已完工程项目情况&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;建设单位&lt;/td&gt;
&lt;td&gt;项目名称&lt;/td&gt;
&lt;td&gt;工程造价（万元）&lt;/td&gt;
&lt;td&gt;开、竣工日期&lt;/td&gt;
&lt;td&gt;在建或已完&lt;/td&gt;
&lt;td&gt;工程质量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标单位名称（公章）：&lt;/p&gt;
&lt;p&gt;法定代表人或授权代理人签字：&lt;/p&gt;
&lt;p&gt;年 月 日&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人员简历表&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;工程名称：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;性别&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;年龄&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;职务&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;职称&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;学历&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;参加工作时间&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;担任质量管理年限&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;工程师证书编号&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;在建和已完工程项目情况&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;建设单位&lt;/td&gt;
&lt;td&gt;项目名称&lt;/td&gt;
&lt;td&gt;工程造价（万元）&lt;/td&gt;
&lt;td&gt;开、竣工日期&lt;/td&gt;
&lt;td&gt;在建或已完&lt;/td&gt;
&lt;td&gt;工程质量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标单位名称（公章）：&lt;/p&gt;
&lt;p&gt;法定代表人或授权代理人签字：&lt;/p&gt;
&lt;p&gt;2011年 月 日&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人员简历表&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;工程名称：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;性别&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;年龄&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;职务&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;职称&lt;/td&gt;
&lt;td&gt;助工&lt;/td&gt;
&lt;td&gt;学历&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;参加工作时间&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;担任计划管理年限&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;工程师证书编号&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;在建和已完工程项目情况&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;建设单位&lt;/td&gt;
&lt;td&gt;项目名称&lt;/td&gt;
&lt;td&gt;工程造价（万元）&lt;/td&gt;
&lt;td&gt;开、竣工日期&lt;/td&gt;
&lt;td&gt;在建或已完&lt;/td&gt;
&lt;td&gt;工程质量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标单位名称（公章）：&lt;/p&gt;
&lt;p&gt;法定代表人或授权代理人签字：&lt;/p&gt;
&lt;p&gt;2011年1月10日&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人员简历表&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;工程名称：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;性别&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;年龄&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;职务&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;职称&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;学历&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;参加工作时间&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;担任养护管理年限&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;工程师证书编号&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;在建和已完工程项目情况&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;建设单位&lt;/td&gt;
&lt;td&gt;项目名称&lt;/td&gt;
&lt;td&gt;工程造价（万元）&lt;/td&gt;
&lt;td&gt;开、竣工日期&lt;/td&gt;
&lt;td&gt;在建或已完&lt;/td&gt;
&lt;td&gt;工程质量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标单位名称（公章）：&lt;/p&gt;
&lt;p&gt;法定代表人或授权代理人签字：&lt;/p&gt;
&lt;p&gt;2011年月日&lt;/p&gt;
&lt;h3&gt;五、项目管理机构配备图&lt;/h3&gt;
&lt;h2&gt;第五章 资格审查申请书格式&lt;/h2&gt;
&lt;h3&gt;一、资格审查申请书&lt;/h3&gt;
&lt;p&gt;致：&lt;/p&gt;
&lt;p&gt;1、经授权作为代表，并以 (以下称&amp;quot;投标单位&amp;quot;)的名义，在充分理解投标单位资格审查文件的基础上，本申请书签字人在此以 的投标单位身份，向你方提出资格审查申请。2、本申请书附有下列内容的正本文件的复印件；&lt;/p&gt;
&lt;p&gt;1.1投标单位的法人营业执照；&lt;/p&gt;
&lt;p&gt;1.2投标单位的 [(资质等级)]{.underline} 证书；&lt;/p&gt;
&lt;p&gt;1.3总公司所在地(适用于投标单位是集团公司的情形)，或所有者的注册地(适用于投标单位是合伙或独资公司的情形)。&lt;/p&gt;
&lt;p&gt;2、你方授权代表可调查、审核我方提交的与本申请书相关的声明、文件和资料，并通过我方的开户银行和客户，澄清申请书中有关财务和技术方面的问题。本申请书还将授权给有关的任何个人或机构及其授权代表，按你方的要求提供必要的相关资料，以核实本申请书中提交的或与本申请人的奖金来源、经验和能力有关的声明和资料。&lt;/p&gt;
&lt;p&gt;3、你方授权代表可通过下列人员得到进一步的资料：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;一般质询和管理方面的质询&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;联系人1：&lt;/td&gt;
&lt;td&gt;电话：&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;联系人2：&lt;/td&gt;
&lt;td&gt;电话：&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;有关人员方面的质询&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;联系人1：&lt;/td&gt;
&lt;td&gt;电话：&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;联系人2：&lt;/td&gt;
&lt;td&gt;电话：&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;有关技术方面的质询&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;联系人1：&lt;/td&gt;
&lt;td&gt;电话：&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;联系人2：&lt;/td&gt;
&lt;td&gt;电话：&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;有关财务方面的质询&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;联系人1：&lt;/td&gt;
&lt;td&gt;电话：&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;联系人2：&lt;/td&gt;
&lt;td&gt;电话：&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;4、本申请充分理解下列情况；&lt;/p&gt;
&lt;p&gt;4.1资格审查合格的投标单位才有可能被授予合同；&lt;/p&gt;
&lt;p&gt;4.2你方保留更改本采购项目的规模和金额的权利。前述情况发生时，投报仅面向资格审查合格且能满足变更后要求的申请人。&lt;/p&gt;
&lt;p&gt;5、我们确认如果我方中标，则我的投标文件和与之相应的合同将得到签署，从而我方受到法律约束。&lt;/p&gt;
&lt;h3&gt;附表1、&lt;/h3&gt;
&lt;h3&gt;二、资格审查申请书附表&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;投标单位一般情况&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;企业注册名称&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;企业注册地址&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;主管部门&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;经营范围&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;企业资质等级&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;经营方式&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;成立时间&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;批准部门&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;批准文号&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;企业性质&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;企业法定代表人&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;注册资金（万元）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;电话&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;开户银行及账号&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;传真&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;职工概况&lt;/td&gt;
&lt;td&gt;职工总数&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;其中：技术人员数&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;高级工程师&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;工程师&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;助理工程师&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;技术员&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单位行政和技术负责人&lt;/td&gt;
&lt;td&gt;姓名&lt;/td&gt;
&lt;td&gt;职务及职称&lt;/td&gt;
&lt;td&gt;年龄&lt;/td&gt;
&lt;td&gt;专业&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公司 [(是否通过，何种)]{.underline} 质量保证体系认证(如通过请附相关证书复印件，并提供认证机构年审监督报告)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主营范围&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;作为总承包人经历年数&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;作为分包人经历年数&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;其他需要说明的情况&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;附表2、&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;近三年已完类似工程一览表&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[投标单位名称：]{.underline}&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;工程名称&lt;/th&gt;
&lt;th&gt;合同身份&lt;/th&gt;
&lt;th&gt;监理(咨询)单位&lt;/th&gt;
&lt;th&gt;合同金额(万元)&lt;/th&gt;
&lt;th&gt;结算金额(万元)&lt;/th&gt;
&lt;th&gt;竣工质量标准&lt;/th&gt;
&lt;th&gt;竣工日期&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;注：&lt;/strong&gt;1、对于已完工程，投标申请人应提供收到的中标通知书或双方签订的承包合同以及工程竣工验收证明。&lt;/p&gt;
&lt;p&gt;2、申请人应列出近三年已完类似工程情况(包括总工程和分包工程)，如有隐瞒，一经查实将导致其投标申请被拒绝。&lt;/p&gt;
&lt;p&gt;3、在建工程投标单位必须附上工程的合同协议书复印件，不填&amp;quot;竣工质量标准&amp;quot;和&amp;quot;竣工日期&amp;quot;两栏。&lt;/p&gt;
&lt;h3&gt;附表3、&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;目前正在建设类似工程概况&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;项目名称&lt;/th&gt;
&lt;th&gt;建设地点&lt;/th&gt;
&lt;th&gt;建设规模&lt;/th&gt;
&lt;th&gt;技术负责人&lt;/th&gt;
&lt;th&gt;开竣工日期&lt;/th&gt;
&lt;th&gt;达到质量标准&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标单位（盖章）：&lt;/p&gt;
&lt;p&gt;法定代表人或授权委托代理人（签字或盖章）：&lt;/p&gt;
&lt;p&gt;日期：2011年月日&lt;/p&gt;
&lt;h3&gt;附表4、&lt;/h3&gt;
&lt;h2&gt;其 它 资 料&lt;/h2&gt;
&lt;p&gt;1、我公司在已完工程和目前在建工程合同履行过程中，得到了客户的好评，没有任何诉讼、纠纷事件。&lt;/p&gt;
&lt;p&gt;2、我公司在所有发包人对投标人所施工的工程得到了客户的一致好评。&lt;/p&gt;
&lt;p&gt;3、如我公司中标，我们将按照投标人须知认真履行招标文件的规定，科学施工，规范养护，力争达到优良工程。&lt;/p&gt;            </description>
            <pubDate>2026-05-14 05:08:56</pubDate>
            <link>https://www.syuez.com/blog/%E7%BB%BF%E5%8C%96%E5%B7%A5%E7%A8%8B%E6%8A%95%E6%A0%87%E4%B9%A6%E6%A8%A1%E6%9D%BF2.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E7%BB%BF%E5%8C%96%E5%B7%A5%E7%A8%8B%E6%8A%95%E6%A0%87%E4%B9%A6%E6%A8%A1%E6%9D%BF2.html</guid>
                                               <category>招投标</category>
                                    </item>
                <item>
            <title>园林工程投标书专业版</title>
            <description>
            &lt;!--
author: admin
date: 2022-12-23
title: 园林工程投标书专业版
tags: 绿化
category: 招投标
status: publish
summary: 招投标~
--&gt;
&lt;h1&gt;转盘绿化工程&lt;/h1&gt;
&lt;h2&gt;投 标 书&lt;/h2&gt;
&lt;p&gt;×××景观园林绿化工程有限公司&lt;/p&gt;
&lt;h2&gt;目 录&lt;/h2&gt;
&lt;p&gt;一、法定代表人身份证明书&lt;/p&gt;
&lt;p&gt;二、签署投标文件授权委托书&lt;/p&gt;
&lt;p&gt;三、投标函及投标函编制说明&lt;/p&gt;
&lt;p&gt;四、投标函附录&lt;/p&gt;
&lt;p&gt;五、标价汇总表&lt;/p&gt;
&lt;p&gt;六、投标人在建项目一览表&lt;/p&gt;
&lt;p&gt;七、投标人近年内承建类似工程一览表&lt;/p&gt;
&lt;p&gt;八、项目管理机构配备情况表&lt;/p&gt;
&lt;p&gt;九、项目管理机构配备情况辅助说明资料&lt;/p&gt;
&lt;p&gt;十、项目经理简历表&lt;/p&gt;
&lt;p&gt;十一、项目技术负责人简历表&lt;/p&gt;
&lt;p&gt;十二、详细预算书&lt;/p&gt;
&lt;p&gt;十三、企业简况&lt;/p&gt;
&lt;p&gt;十四、施工组织设计&lt;/p&gt;
&lt;p&gt;十五、拟投入主要施工机械设备表&lt;/p&gt;
&lt;p&gt;十六、劳动力计划表&lt;/p&gt;
&lt;p&gt;十七、计划开、竣工日期和进度计划表&lt;/p&gt;
&lt;p&gt;十八、其他材料&lt;/p&gt;
&lt;h2&gt;法定代表人身份证明书&lt;/h2&gt;
&lt;p&gt;单位名称： [×××景观园林绿化工程有限公司]{.underline}&lt;/p&gt;
&lt;p&gt;单位性质： [私 营]{.underline}&lt;/p&gt;
&lt;p&gt;地 址： [×××开放大道49号]{.underline}&lt;/p&gt;
&lt;p&gt;成立时间： [2001 年 02 月 15 日]{.underline}&lt;/p&gt;
&lt;p&gt;经营期限： [5年]{.underline}&lt;/p&gt;
&lt;p&gt;姓名：[×××]{.underline} 性别： [男]{.underline} 年龄： [56岁]{.underline} 职务： [董事长]{.underline}&lt;/p&gt;
&lt;p&gt;系：[×××景观园林绿化工程有限公司]{.underline}的法定代表人&lt;/p&gt;
&lt;p&gt;特此证明。&lt;/p&gt;
&lt;p&gt;投标人：×××景观园林绿化工程有限公司&lt;/p&gt;
&lt;p&gt;日期：&lt;/p&gt;
&lt;h2&gt;签署投标文件授权委托书&lt;/h2&gt;
&lt;p&gt;本授权委托书声明：我[×××]{.underline}系[×××景观园林绿化工程有限公司]{.underline}的法定代表人，现授权委托[×××景观园林绿化工程有限公司]{.underline}的[×××]{.underline}为我公司签署本工程的投标文件的法定代表人授权委托代理人，我承认代理人全权代表我所签署的本工程的投标文件的内容。&lt;/p&gt;
&lt;p&gt;代理人无转委托权，特此委托。&lt;/p&gt;
&lt;p&gt;代理人： [×××]{.underline} 性别： [男]{.underline} 年龄： []{.underline}&lt;/p&gt;
&lt;p&gt;身份证号码： [*****************]{.underline} 职务： [总经理]{.underline}&lt;/p&gt;
&lt;p&gt;投标人： [×××景观园林绿化工程有限公司]{.underline}&lt;/p&gt;
&lt;p&gt;法定代表人： [×××]{.underline}&lt;/p&gt;
&lt;p&gt;授权委托日期： &lt;/p&gt;
&lt;h2&gt;投 标 函&lt;/h2&gt;
&lt;p&gt;致：×××规划建设局&lt;/p&gt;
&lt;p&gt;1、根据你方×××[大民主桥转盘绿化工程]{.underline}施工招标文件，遵照《中华人民共和国招标法》等有关规定，经踢勘现场和研究上述招标文件的投标须知、合同条款、图纸、工程建设标准和工程量清单及其他有关文件后，我方愿以人民币 万元（小写： 元）的投标报价并按上述图纸、合同条款、工程建设标准和工程量清单的条件要求承包上述工程的施工、竣工，并承担任何质量缺陷保修责任。&lt;/p&gt;
&lt;p&gt;2、我方已详细审核全部招标文件，及有关附件。&lt;/p&gt;
&lt;p&gt;3、我方承认投标函附录的我方投标函的组成部分。&lt;/p&gt;
&lt;p&gt;4、一旦我方中标，我方保证按合同主要条款中规定的工期 [30]{.underline} 个日历天完成并移交全部工程，工程质量达到 [优良]{.underline} 标准。&lt;/p&gt;
&lt;p&gt;5、我方同意所提交的投标文件在&amp;quot;投标申请人投标须知&amp;quot;第十九条规定的投标有效期内有效，在此期间内如果中标，我方将接受此约束。&lt;/p&gt;
&lt;p&gt;6、除非另外达成协议并生效，你方的中标通知书和本投标文件将成为约束双方的合同文件的组成部分。&lt;/p&gt;
&lt;p&gt;7、我方将与不投标函一起，提交 [人民币万元（￥元）]{.underline}作为投标担保。&lt;/p&gt;
&lt;p&gt;投 标 人： ×××[景观园林绿化工程有限公司]{.underline}&lt;/p&gt;
&lt;p&gt;单位地址： ×××[开放大道49号]{.underline}&lt;/p&gt;
&lt;p&gt;委托代理人： ×××&lt;/p&gt;
&lt;p&gt;邮政编码： ××× 电话： ××× 传真： ×××&lt;/p&gt;
&lt;p&gt;开户银行名称：&lt;/p&gt;
&lt;p&gt;开户银行帐号：&lt;/p&gt;
&lt;p&gt;开户银行地址：&lt;/p&gt;
&lt;p&gt;开户银行电话：&lt;/p&gt;
&lt;p&gt;日期： &lt;/p&gt;
&lt;h2&gt;投 标 书 编 制 说 明&lt;/h2&gt;
&lt;p&gt;尊敬的各位领导、评委：&lt;/p&gt;
&lt;p&gt;衷心感谢×××建设局对我单位的信任，将我单位列入×××大民主桥转盘绿化工程承包候选队伍之一。本标书按照招标文件及我单位自身实力综合考虑后编制的，包括本工程各分项分部的预算及总造价浮动率。如我单位中标，将竭诚为该工程的建设作贡献。&lt;/p&gt;
&lt;p&gt;我们对招标文件进行了认真研究，对现场施工条件、土壤、气候等进行了仔细的踏勘调查分析，并充分考虑了该标段中可能出现的直接影响报价和施工的各种因素编制了本投标书。&lt;/p&gt;
&lt;h3&gt;一、我们的保证措施：&lt;/h3&gt;
&lt;p&gt;1、思想保证、组织落实&lt;/p&gt;
&lt;p&gt;本公司主要领导和技术负责人将直接领导并监督工程项目的质量、工期、安全和文明施工，负责本工程的施工全过程。&lt;/p&gt;
&lt;p&gt;我们将把本工程列入本年度我单位重点工程，从各方面保证本工程的顺利实施，同时委派最优秀的项目班子和项目经理来负责本工程的施工管理。凡是进场参加施工的员工，在进场前需了解建设本工程的重要意义和承建该工程的光荣性和艰苦性，从而在思想上予以充分落实和保证。&lt;/p&gt;
&lt;p&gt;2、奖励机制、激励机制&lt;/p&gt;
&lt;p&gt;在思想保证和组织落实的前提下，建立工程奖励措施，激励员工努力工作。我们深知在市场经济的条件下，建立一些奖励措施是非常必要的。我们在工程施工过程中留出奖励费用用于奖励现场施工有功人员，奖励本工程的广大建设者为本工程发挥聪明才智，作出贡献。&lt;/p&gt;
&lt;p&gt;3、工程的建设过程中坚决服从业主、坚决服从设计意图&lt;/p&gt;
&lt;p&gt;鉴于本工程的特殊性和重要性，我们保证在工程施工过程中坚决服从业主要求，坚决服从设计要求，确保工程质量和工程工期，充分利用工程场地和空间，进行立体交叉施工。&lt;/p&gt;
&lt;p&gt;4、为业主做好施工前期准备工作&lt;/p&gt;
&lt;p&gt;我单位拟派员为业主提供服务，并且利用我单位多年的施工经验主动为业主出谋划策，为业主排忧解难。&lt;/p&gt;
&lt;p&gt;5、本工程质量标准为合格工程。&lt;/p&gt;
&lt;h3&gt;二、选派强有力的项目部和最优秀的项目经理承建本工程&lt;/h3&gt;
&lt;p&gt;1、选派责任心强、技术精干的项目经理负责本工程的施工管理。本工程若由我单位中标，我们将选派实力雄厚的项目经理来承担此重任，该经理部曾承建过一系列大中型园林环境综合工程。&lt;/p&gt;
&lt;p&gt;2、我们将选派最优秀的项目经理负责本工程的具体实施，他们具有丰富的承建工程的经验，是一支特别能吃苦的战斗集体，一定能将射阳县大民主桥转盘绿化工程建设好，为县政府和全县人民建成一块景致优美的城市园林绿化景观。&lt;/p&gt;
&lt;h3&gt;三、工程工期&lt;/h3&gt;
&lt;p&gt;本工程计划开工日期为（以开工令为准），竣工日期为。计划工期为30天（日历日），养护工期从起至日止，为期二年。&lt;/p&gt;
&lt;h3&gt;四、严格工程管理&lt;/h3&gt;
&lt;p&gt;建立完整的工程体系，强化质量管理，主要有计划管理、技术管理、材料管理、劳动安全管理等，使管理工作在工程的整个施工过程中体现出工程的速度和效益。&lt;/p&gt;
&lt;h3&gt;五、投标报价编制依据&lt;/h3&gt;
&lt;p&gt;1、《×××大民主桥转盘绿化工程》和施工图纸&lt;/p&gt;
&lt;p&gt;2、《城市绿化工程施工及验收规范》（CJJ/T82-99）&lt;/p&gt;
&lt;p&gt;3、《城市市政工程施工及验收规范》&lt;/p&gt;
&lt;p&gt;4、《江苏省园林绿化工程质量检验评定标准》（试行）&lt;/p&gt;
&lt;p&gt;5、《×××市城市绿化养护管理暂行办法》&lt;/p&gt;
&lt;p&gt;6、《×××市大树移植技术操作规范》&lt;/p&gt;
&lt;p&gt;7、国家和江苏省有关主管部门颁发的有关文件&lt;/p&gt;
&lt;p&gt;×××景观园林绿化工程有限公司&lt;/p&gt;
&lt;h2&gt;投 标 书 附 录&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;事 项&lt;/th&gt;
&lt;th&gt;合 同 条 款&lt;/th&gt;
&lt;th&gt;要 求&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;投标担保金额&lt;/td&gt;
&lt;td&gt;见第一章投标须知 一、总则第一条第3款规定&lt;/td&gt;
&lt;td&gt;人民币贰万元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;履约保证金&lt;/td&gt;
&lt;td&gt;见第一章投标须知 三、投标文件第二十条第3款规定&lt;/td&gt;
&lt;td&gt;人民币贰万元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;建设方发出开工通知的时间&lt;/td&gt;
&lt;td&gt;见第三章技术条款 六、实施进度规定&lt;/td&gt;
&lt;td&gt;拟2004年7月2日&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;施工工期、养护期&lt;/td&gt;
&lt;td&gt;见第三章技术条款 六、实施进度规定&lt;/td&gt;
&lt;td&gt;施工期为30个日历日，养护期为二年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;误期赔偿费金额&lt;/td&gt;
&lt;td&gt;见第二章合同条款第十三条第（三）款规定&lt;/td&gt;
&lt;td&gt;工期每拖延一天以人民币3000元标准实行处罚&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;误期赔偿费限额&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;5万元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;缺陷责任期&lt;/td&gt;
&lt;td&gt;见第二章合同条款第十四条规定&lt;/td&gt;
&lt;td&gt;24月&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;×××景观园林绿化工程有限公司&lt;/p&gt;
&lt;h2&gt;报 价 汇 总 表&lt;/h2&gt;
&lt;p&gt;工程名称：×××大民主桥转盘绿化工程&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;工程项目名称&lt;/th&gt;
&lt;th&gt;合计（元）&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;一&lt;/td&gt;
&lt;td&gt;绿化工程&lt;/td&gt;
&lt;td&gt;124312.30&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;四季花草&lt;/td&gt;
&lt;td&gt;17100.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;椤木石楠&lt;/td&gt;
&lt;td&gt;25200.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;金叶女贞&lt;/td&gt;
&lt;td&gt;16850.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;红花继木&lt;/td&gt;
&lt;td&gt;25762.50&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;小龙柏&lt;/td&gt;
&lt;td&gt;31608.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;黄杨球&lt;/td&gt;
&lt;td&gt;1740.80&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;矮生高羊茅&lt;/td&gt;
&lt;td&gt;6057.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;二&lt;/td&gt;
&lt;td&gt;土方工程&lt;/td&gt;
&lt;td&gt;238018.99&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;推土机平整场地&lt;/td&gt;
&lt;td&gt;4474.23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;原土打底夯&lt;/td&gt;
&lt;td&gt;434.23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;碎石干铺基础垫层&lt;/td&gt;
&lt;td&gt;14061.53&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;C15无筋砼垫层&lt;/td&gt;
&lt;td&gt;10509.82&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;C20砼无筋垫层&lt;/td&gt;
&lt;td&gt;5875.86&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;M5水泥砂浆砌标准砖挡土墙&lt;/td&gt;
&lt;td&gt;9201.07&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;镜面中国黑大理石&lt;/td&gt;
&lt;td&gt;30729.79&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;指甲圆石材磨边加工&lt;/td&gt;
&lt;td&gt;8044.12&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;603芝麻白大理石&lt;/td&gt;
&lt;td&gt;14979.77&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;603毛面芝麻白大理石&lt;/td&gt;
&lt;td&gt;4246.51&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;603路牙及砼路沿&lt;/td&gt;
&lt;td&gt;84891.53&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;材料调差&lt;/td&gt;
&lt;td&gt;69283.06&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;外购土方&lt;/td&gt;
&lt;td&gt;47600.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;三&lt;/td&gt;
&lt;td&gt;安装工程&lt;/td&gt;
&lt;td&gt;36213.26&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;塑料管(粘接)管外径25mm&lt;/td&gt;
&lt;td&gt;25633.29&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;塑料管(粘接)管外径32mm&lt;/td&gt;
&lt;td&gt;564.61&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;塑料管(粘接)管外径50mm&lt;/td&gt;
&lt;td&gt;1935.08&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;塑料管件安装(粘接)管外径25mm&lt;/td&gt;
&lt;td&gt;747.60&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;塑料管件安装(粘接)管外径32mm&lt;/td&gt;
&lt;td&gt;9.36&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;塑料管件安装(粘接)管外径50mm&lt;/td&gt;
&lt;td&gt;180.72&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;人工松填土&lt;/td&gt;
&lt;td&gt;408.12&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;人工挖一、二类土&lt;/td&gt;
&lt;td&gt;739.86&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;喷头&lt;/td&gt;
&lt;td&gt;4050.60&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;泵&lt;/td&gt;
&lt;td&gt;3115.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;四&lt;/td&gt;
&lt;td&gt;其他&lt;/td&gt;
&lt;td&gt;63000.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;拆除原花池铺装等&lt;/td&gt;
&lt;td&gt;23000.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;设计、监理、编标、招标等费用&lt;/td&gt;
&lt;td&gt;40000.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;预算总价：461544.55&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;投标总报价：&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;投标人：×××路路景观园林绿化工程有限公司&lt;/p&gt;
&lt;p&gt;委托代理人：×××&lt;/p&gt;
&lt;p&gt;日期：&lt;/p&gt;
&lt;h2&gt;企业简况&lt;/h2&gt;
&lt;p&gt;×××景观园林工程有限公司隶属×××绿化工程集团有限公司，是一家实力较强的园林工程绿化企业。本公司现有总资产500多万元，苗木、草坪基地5000多亩，品种800多个，辐射华东、华南、华北地区。&lt;/p&gt;
&lt;p&gt;本公司现有高、中级专职科技人员45人，职工360多人。&lt;/p&gt;
&lt;p&gt;本公司承接城市道路、庭院、公园、园林绿化、美工工程的设计和施工，从长廊花架到假山、喷泉瀑布，从亭台水榭到门楼牌坊，从室内置景到室外小品、雕塑，从地面园林到空中花园，从民族风格的园林建筑到异国风情的艺术创意，无论局部造型还是整体设计施工，本公司都以一流的设计和施工水平赢得客户的信赖。&lt;/p&gt;
&lt;p&gt;我公司积极引进和培育了一大批室内观叶植物及各种盆花，经过几年的发展，本公司现有花卉培育基地200余亩，温室150座，计7.5万平方米。主要供应播种苗和室内盆栽花卉，用于销售和租赁。另外我公司还在广东、海南等地设立了热带观叶植物基地，基本实现了辐射全国网络经营的集团化经营模式。&lt;/p&gt;
&lt;p&gt;近两年来在盐城竣工的工程有：×××绿化工程等等，都受到了业主的一致好评。&lt;/p&gt;
&lt;p&gt;×××景观园林工程有限公司&lt;/p&gt;
&lt;h2&gt;施工技术方案&lt;/h2&gt;
&lt;h3&gt;一、施工流程图&lt;/h3&gt;
&lt;p&gt;前 期 准 备&lt;/p&gt;
&lt;p&gt;地 形 改 造&lt;/p&gt;
&lt;p&gt;基 础 碎 石 垫 层&lt;/p&gt;
&lt;p&gt;基 础 砼 垫 层&lt;/p&gt;
&lt;p&gt;砖 砌 挡 土 墙&lt;/p&gt;
&lt;p&gt;中 国 黑 大 理 石&lt;/p&gt;
&lt;p&gt;603芝麻 白大理石&lt;/p&gt;
&lt;p&gt;603毛 面 芝 麻白&lt;/p&gt;
&lt;p&gt;603路 牙 施 工&lt;/p&gt;
&lt;p&gt;铺 种 草 皮&lt;/p&gt;
&lt;p&gt;喷 灌 工 程 施 工&lt;/p&gt;
&lt;p&gt;种 植 期 养 护&lt;/p&gt;
&lt;p&gt;绿 地 平 整&lt;/p&gt;
&lt;p&gt;栽 植 灌 木&lt;/p&gt;
&lt;p&gt;铺 种 地 被 植 物&lt;/p&gt;
&lt;p&gt;零星项目找补&lt;/p&gt;
&lt;p&gt;清 场 竣 工&lt;/p&gt;
&lt;p&gt;养 护 期 养 护&lt;/p&gt;
&lt;h3&gt;二、工程概况&lt;/h3&gt;
&lt;p&gt;本工程为×××大民主桥转盘绿化工程。位于×××县城大民主桥西侧，工程造价约为×××万元。&lt;/p&gt;
&lt;p&gt;本工程包含绿化部分、土建部分和喷灌系统。&lt;/p&gt;
&lt;h3&gt;三、工程实施思想及目标&lt;/h3&gt;
&lt;h4&gt;1、指导思想&lt;/h4&gt;
&lt;p&gt;鉴于本工程的重要性和影响力，我公司施工组织的指导思想是：以质量为中心，建立工程质量保证体系，选配具有良好业绩，有多年施工经验的项目经理、工程师及工程技术管理人员，实行项目法管理。积极推广应用新技术、新工艺、新设备、新材料，精心组织、科学管理、优质高速、文明安全地完成施工任务，创造全市一流水平的园林景观工程。&lt;/p&gt;
&lt;h4&gt;2、实施目标&lt;/h4&gt;
&lt;p&gt;充分发挥我公司企业集团优势，科学、合理地组织土建、绿化和安装等交叉作业，精心施工，严格履行合同，确保实现如下目标：&lt;/p&gt;
&lt;p&gt;（1）质量目标：单位工程一次验收合格。&lt;/p&gt;
&lt;p&gt;（2）工期目标：工程竣工交付：自开工之日30个日历日。&lt;/p&gt;
&lt;p&gt;（3）安全生产目标：采取有效措施，严格控制轻伤事故，杜绝重大安全事故的发生。&lt;/p&gt;
&lt;p&gt;（4）文明生产目标：采取有效措施，文明施工，形成我市标准化工程。&lt;/p&gt;
&lt;p&gt;（5）科技进步目标：为实现上述质量、工期、安全、文明施工等目标，充分发挥&amp;quot;科技是第一生产力&amp;quot;的作用，在施工中积极采用我公司成熟的技术成果，确保该工程保质、保量、安全有序的施工。&lt;/p&gt;
&lt;p&gt;（6）服务目标：严格履行合同，保证施工期间工地所有的安全消防，市容保洁、治安保卫、文明施工、地方矛盾等问题全部由我公司负责，接受业主、质量监督部门等单位对工程质量，工程进度、计划协调、现场管理的管理制和监督。&lt;/p&gt;
&lt;h3&gt;四、施工布置&lt;/h3&gt;
&lt;h4&gt;1、项目施工组织安排&lt;/h4&gt;
&lt;p&gt;本工程实行项目法管理，由公司委派具有良好业绩的项目经理作为单位企业法人在该工程上的全权委托代表，并配备施工经验丰富的专业技术人员与职能人员，组建各职能部门，在公司领导下，负责工程的具体实施，以保障工程能在预定工期内保质、保量的顺序施工。&lt;/p&gt;
&lt;p&gt;公司以项目管理部为核心，组建强有力的施工队伍，配备先进的机具、设备，以科学的手段，先进的技术，为优质高速地完成建军桥景观绿化工程提供强有力的支持。&lt;/p&gt;
&lt;h4&gt;2、项目管理部网络组成：&lt;/h4&gt;
&lt;h4&gt;3、项目部主要人员组成&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;项目经理：&lt;/p&gt;
&lt;p&gt;土建负责人：&lt;/p&gt;
&lt;p&gt;绿化负责人：&lt;/p&gt;
&lt;p&gt;技术负责人：&lt;/p&gt;
&lt;p&gt;核算员：&lt;/p&gt;
&lt;p&gt;质检员：&lt;/p&gt;
&lt;p&gt;安全员：&lt;/p&gt;
&lt;p&gt;材料员：&lt;/p&gt;
&lt;p&gt;材试员：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;五、土建工程主要工序的施工方案&lt;/h3&gt;
&lt;h4&gt;1、施工顺序&lt;/h4&gt;
&lt;p&gt;施工原则按先地下后地上、先外而内，施工中应注意各项施工的有效搭配，避免不合理的窝工现象。&lt;/p&gt;
&lt;p&gt;在施工过程中，砌体工程穿插进行，水电等设备安装与土建配合施工。&lt;/p&gt;
&lt;h4&gt;2、施工准备&lt;/h4&gt;
&lt;h5&gt;A、技术准备&lt;/h5&gt;
&lt;p&gt;1〉、编制施工图预算和施工预算，为施工进度计划，人、财、物的合理搭配提供数字依据。&lt;/p&gt;
&lt;p&gt;2〉、熟悉图纸，了解设计要求、质量要求及细部做法。&lt;/p&gt;
&lt;p&gt;3〉、交底工作的准备抓住工程的重点，突出难点，简要而清楚的交代操作要点、工程中的新工艺、新要求。&lt;/p&gt;
&lt;p&gt;4〉、编制各项分部工程的施工方案，作好冬季施工安排。&lt;/p&gt;
&lt;p&gt;5〉、提供建材试验计划，进行新技术项目的试制和试验。&lt;/p&gt;
&lt;h5&gt;B、物资准备&lt;/h5&gt;
&lt;p&gt;1〉、根据施工预算及进度分析，按材料名称、规格、所用时间，编制材料需要计划，并确定建筑耗材，及配件等进场时间。&lt;/p&gt;
&lt;p&gt;2〉、编制各种机械、机具需要量计划，电动设备需接地试运行，并检查安全装置是否可靠。&lt;/p&gt;
&lt;h5&gt;C、劳动组织准备&lt;/h5&gt;
&lt;p&gt;1〉、调查各班组的人员配备情况，技术力量，生产能力。&lt;/p&gt;
&lt;p&gt;2〉、确定阶段性劳动量计划，并协调各工种间的搭接时间、部位。&lt;/p&gt;
&lt;h5&gt;D、施工现场准备&lt;/h5&gt;
&lt;p&gt;1〉、做好施工现场控制网的测量。&lt;/p&gt;
&lt;p&gt;2〉、搞好&amp;quot;三通一平&amp;quot;。&lt;/p&gt;
&lt;p&gt;3〉、施工道路：&lt;/p&gt;
&lt;p&gt;a、场地运输：施工道路的主入口根据业主提供的图纸，并与以后场内永久性道路相结合，设置一条主干运输道。&lt;/p&gt;
&lt;p&gt;b、道路做法：素土夯实，上铺10cm的碎石垫层，填平夯实，并做10cm砼面层。&lt;/p&gt;
&lt;p&gt;4〉、施工用水：水源由建设单位引入施工现场后，我施工单位用软管引至各用水点，过路时加套管防护。&lt;/p&gt;
&lt;p&gt;5〉、地面排水：雨水通过排水沟直接流入城市集水窨井，施工污水经沉淀后直接排入城市下水总管。&lt;/p&gt;
&lt;p&gt;6〉、进行现场清理，保证道路畅通，搭设好临时设施，准备好临时操作台。&lt;/p&gt;
&lt;p&gt;7〉、制定消防、保卫措施，设置消防、保卫设施。&lt;/p&gt;
&lt;p&gt;8〉、施工场外准备：施工场外准备主要包括建筑材料的加工和定货以及材料的租赁。&lt;/p&gt;
&lt;p&gt;9〉、施工现场机械及工具的配备（如下表）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;机 具 名 称&lt;/th&gt;
&lt;th&gt;机 具 型 号&lt;/th&gt;
&lt;th&gt;单 位&lt;/th&gt;
&lt;th&gt;数 量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;汽车吊&lt;/td&gt;
&lt;td&gt;15T&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;砼搅拌机&lt;/td&gt;
&lt;td&gt;JQ350&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;灰浆搅拌机&lt;/td&gt;
&lt;td&gt;VT325&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;钢筋切割机&lt;/td&gt;
&lt;td&gt;GT40&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;插入式振动棒&lt;/td&gt;
&lt;td&gt;ZX70&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;平板震动器&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;木工电刨&lt;/td&gt;
&lt;td&gt;MZB2-80&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;电焊机&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;割草机&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;斗式拖拉机&lt;/td&gt;
&lt;td&gt;2T&lt;/td&gt;
&lt;td&gt;辆&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;磨光机&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;载重卡车&lt;/td&gt;
&lt;td&gt;5T&lt;/td&gt;
&lt;td&gt;辆&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;翻斗车&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;辆&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;地磅&lt;/td&gt;
&lt;td&gt;1T&lt;/td&gt;
&lt;td&gt;台&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;3、质量管理措施&lt;/h4&gt;
&lt;h5&gt;A、建立施工组织设计及施工方案审批制度&lt;/h5&gt;
&lt;p&gt;1〉、施工组织设计及施工方案必须经项目经理及所属责任人员共同审核，并上报公司工程技术科审批。&lt;/p&gt;
&lt;p&gt;2〉、经本公司通过后，报于建设、监理单位，得到同意后方可进行施工。&lt;/p&gt;
&lt;p&gt;3〉、施工组织设计及施工方案必须经各级审批，并按审批意见进行修改执行。&lt;/p&gt;
&lt;h5&gt;B、建立技术复核、隐蔽工程验收制度&lt;/h5&gt;
&lt;p&gt;1〉、编制技术复核计划，明确复核内容、部位，及时与监理单位联系，确定复核时间与复核方法。本工程复核重点是标高和几何尺寸及苗木品种和规格。&lt;/p&gt;
&lt;p&gt;2〉、技术复核结果应填写&amp;quot;工程技术复核记录&amp;quot;并作为施工技术资料归档。&lt;/p&gt;
&lt;p&gt;3〉、凡分项工程施工的结果被后道工序所覆盖，均应进行隐蔽工程验收，隐蔽验收的结果必须填写&amp;quot;隐蔽工程验收记录&amp;quot;作为档案资料保存。&lt;/p&gt;
&lt;p&gt;4〉、技术复核与隐蔽工程验收流程图如下：&lt;/p&gt;
&lt;p&gt;技术复核 → 分项内容 → 自查修整 → 填写复核单 → 质检员复验 → 项目技术负责验收签证 → 送交监理单位验收监证&lt;/p&gt;
&lt;p&gt;隐蔽工程验收 → 分项内容 → 自查修整 → 填写验收单 → 技术员质检员复核 → （同上）&lt;/p&gt;
&lt;p&gt;（若不合格则返回自查修整）&lt;/p&gt;
&lt;h5&gt;C、建立材料管理制度&lt;/h5&gt;
&lt;p&gt;1〉、凡在图纸标明强度等级的砼、砂浆均属配比管理范围。&lt;/p&gt;
&lt;p&gt;2〉、项目实验员负责各种配比的接受发送工作，负责向施工班组进行配比交底，负责现场试块制作、养护及送试工作，并监督配比的执行情况。&lt;/p&gt;
&lt;p&gt;3〉、遵照现行施工规范进行各种材料试验，如有问题应及时汇报，保证不出差错。&lt;/p&gt;
&lt;h5&gt;D、建立施工阶段&amp;quot;砼浇灌令&amp;quot;制度&lt;/h5&gt;
&lt;p&gt;1〉、浇筑必须严格执行签署砼浇筑令制度。&lt;/p&gt;
&lt;p&gt;2〉、&amp;quot;砼浇筑令&amp;quot;由工种负责人填写，经项目经理验收签发，并征求监理意见。&lt;/p&gt;
&lt;p&gt;3〉、&amp;quot;砼浇筑令&amp;quot;申请签发条件：&lt;/p&gt;
&lt;p&gt;a、支撑系统按施工方案施工完毕；&lt;/p&gt;
&lt;p&gt;b、模板钢筋及其支架质量符合规定验收合格；&lt;/p&gt;
&lt;p&gt;c、技术复核隐蔽工作验收且符合签证；&lt;/p&gt;
&lt;p&gt;d、施工范围内安全设施落实；&lt;/p&gt;
&lt;p&gt;e、施工机具准备就绪且正常运行；&lt;/p&gt;
&lt;p&gt;f、材料供应准备完毕。&lt;/p&gt;
&lt;h5&gt;E、健全技术、质量交底制度&lt;/h5&gt;
&lt;p&gt;技术质量交底工作是施工基础管理中一项不可缺少的重要内容，交底采用书面签证确认形式。他包括：&lt;/p&gt;
&lt;p&gt;（1）、当项目部接到图纸后，由项目经理组织项目部全体人员对图纸进行认真学习，弄清设计意图。&lt;/p&gt;
&lt;p&gt;（2）、施工组织设计送审得到确认后，由项目技术负责人组织现场施工人员认真学习施工方案，并进行技术、质量、安全交底，讨论各监控部位及监控要点。&lt;/p&gt;
&lt;p&gt;（3）、本工程实行谁施工谁负责质量、安全工作的原则，各分管工种负责，在安排施工任务的同时，必须对施工班组进行书面技术质量安全交底，必须做到交底不明确不上岗，不签证不上岗，交底单由项目负责人签证并存入资料备查。&lt;/p&gt;
&lt;p&gt;（4）、施工图纸钢筋、木工、瓦工各一份，工种负责人做好事前翻样工作，图纸不得带入施工现场直接参与施工，违者重罚。&lt;/p&gt;
&lt;h5&gt;F、完善二级验收及分部分项质量评定体系&lt;/h5&gt;
&lt;p&gt;（1）、分项工程施工过程中，各分类工种负责人必须督促班组做好自检工作，确保当天事当天了。&lt;/p&gt;
&lt;p&gt;（2）、各分项工程施工完毕后，各分管工种负责人必须及时组织班组进行分项工程评定工作，并填写分项工程质量评定表交质检员确认，最后由项目负责人核定。&lt;/p&gt;
&lt;p&gt;（3）、项目经理每月组织一次施工班组之间的质量质检，并进行质量讲评，奖优罚劣。&lt;/p&gt;
&lt;p&gt;（4）、项目部质量安全科对每个项目进行不定期抽样检查，发现问题以书面形式发出限期整改指令单，处理结果定期返回质量安全科，不得借故拖延。&lt;/p&gt;
&lt;p&gt;（5）、即使与甲方和监理单位联系，确认需验收部位及验收条件，分部工程验收由甲方、监理单位公司技术科和项目负责人一并参加，共同完成分部工程核验及签证。&lt;/p&gt;
&lt;h5&gt;G、健全现场材料质量管理体系&lt;/h5&gt;
&lt;p&gt;（1）、严格控制外加工采购材料的质量。&lt;/p&gt;
&lt;p&gt;各类建筑材料到现场后必须由项目经理及项目负责人组织有关人员进行抽样检查，发现问题立即与供货商联系，直到退货。&lt;/p&gt;
&lt;p&gt;（2）、搞好原材料二次复试取样工作。&lt;/p&gt;
&lt;p&gt;水泥必须取样进行物理试验，钢筋原材料必须取样进行物理试验，必要时还须进行化学分析及可焊性试验，所有防水材料必须取样复试，C30等级以上砼骨料须进行取样分析，存放期超过3个月的水泥必须重新取样进行物理试验，合格后放可使用。&lt;/p&gt;
&lt;h5&gt;H、计量器的管理&lt;/h5&gt;
&lt;p&gt;（1）、质量安全科负责工整计量器具的鉴定、监督及管理工作。&lt;/p&gt;
&lt;p&gt;（2）、现场计量器具必须确定专人保管、专人使用，他人不得随意动用，以免造成人为损坏或计量不准。&lt;/p&gt;
&lt;p&gt;（3）、损坏的计量器具必须及时申报修理调整，不得带病工作。&lt;/p&gt;
&lt;h5&gt;I、健全工程质量奖惩制度&lt;/h5&gt;
&lt;p&gt;（1）、总承包方遵循&amp;quot;谁施工，谁负责&amp;quot;的原则，对各工种及各分包单位进行全面质量管理和追踪检查。&lt;/p&gt;
&lt;p&gt;（2）、凡在施工过程中违反操作规程，不按图施工，屡教不改或发生质量问题的单位及个人，项目部分管负责人有权对其进行处罚。处罚形式为停工整改、罚款直至赶出本工程。&lt;/p&gt;
&lt;p&gt;（3）、凡在施工过程中按图施工，质量优良，项目部可视实际情况对班组或分包单位进行奖励，奖励形式为表扬、表彰及资金等。&lt;/p&gt;
&lt;p&gt;（4）、项目部实施奖罚以平时检查抽查，每月一次检查，以及质检单位核查评定为依据。&lt;/p&gt;
&lt;h5&gt;J、健全竣工图的编制、审核、移交、工程资料管理制度&lt;/h5&gt;
&lt;p&gt;（1）、建设单位除提供施工用图外，还应提供两套图纸给承包方作为编制竣工图用。&lt;/p&gt;
&lt;p&gt;（2）、根据建筑设计的设计变更、书面指示、技术核定单编制竣工图后，应及时汇总并装订成册。&lt;/p&gt;
&lt;p&gt;（3）、竣工图的图面应整洁，一律采用碳素墨水书写，字迹端正清楚，编绘者和审定者均应在竣工图上签字盖章。&lt;/p&gt;
&lt;p&gt;（4）、工地设专职资料员，定期收集，向各部门、各分包单位提供的各类表格和资料，按甲方和监理单位要求分类汇总、审核、装订。&lt;/p&gt;
&lt;p&gt;（5）、工程竣工后，由总承包方将竣工图和工程资料一起交给发包方。&lt;/p&gt;
&lt;h4&gt;4、施工总平面图布置&lt;/h4&gt;
&lt;p&gt;根据&amp;quot;有利生产，方便生活，紧凑合理，安全放火和保护环境&amp;quot;的原则，结合本工程的实际情况，平面安排如下（见施工总平面布置图）：&lt;/p&gt;
&lt;p&gt;（1）、现场设搅拌机两台，砂、石、水泥以搅拌机为中心堆放，注意堆放合理，并要保证施工道路的通畅。其他钢筋、砖等成品或半成品均应布设在拟建的建筑物、小品等周边，以免二次搬运。&lt;/p&gt;
&lt;p&gt;（2）、合理利用部分在建房屋，在满足生产要求前提下，尽量不建或少建临时设施。&lt;/p&gt;
&lt;p&gt;（3）、水、电管线均由建设单位指定位置引入，埋入地下30cm，避开施工障碍，合理布置。&lt;/p&gt;
&lt;h3&gt;六、绿化工程主要工序的施工方案&lt;/h3&gt;
&lt;h4&gt;1、地形改造&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;技术关键：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;确保原有树木、植被的保存率；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;充分利用原有地形上的优质表土；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;合理调配土方，减少重复倒运；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;竖向起伏线条流畅，塑造完美地形；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;土壤改良以满足树木生长为前提。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于本工程工期紧，前期土方工程以机械施工为主，用挖土机进行土方地形的整理。地形施工要根据设计意图，达到自然流畅。我方通过认真勘察现场，对总平面图、施工图审核分析，制订了如下土方施工技术方案：&lt;/p&gt;
&lt;p&gt;根据施工图和现状图用网络法计算出土方工程量，其中包括挖方、填方和进土量。计算出土方的施工标高、填区面积，挖填区土量，并考虑各种变更因素（如土壤的可松性、压缩率、沉降量）进行调整后，对土方进行综合平衡与调配，确定最优调配方案并绘出土方调配图。&lt;/p&gt;
&lt;p&gt;平衡与调配应遵循如下原则：&lt;/p&gt;
&lt;p&gt;（1）挖方与填方基本达到平衡，减少重复倒运；&lt;/p&gt;
&lt;p&gt;（2）挖填方量与运距的乘积之和尽可能为最小，即总土方运输量或运输费用最小；&lt;/p&gt;
&lt;p&gt;（3）好土应用在回填密度要求较高的地区；&lt;/p&gt;
&lt;p&gt;（4）分区调配应与全场调配相协调，避免只顾局部平衡，任意挖填而破坏全局平衡；&lt;/p&gt;
&lt;p&gt;（5）选择恰当的调配方向、运输路线、施工顺序，避免土方运输出场对流和乱流现象，同时便于机具调配、机械化施工。&lt;/p&gt;
&lt;p&gt;总之，深翻加高坡盲沟、平地深洞三结合，可以确保排水通畅，土壤疏松，土壤固、液、气三态相比适当，在土壤物理性方面创造了有利于树木成活并茁壮成长的良好土壤环境。&lt;/p&gt;
&lt;h4&gt;2、表土细作&lt;/h4&gt;
&lt;p&gt;用六齿钉耙把已翻松的土壤拉平、耙细，拣出砾石、草根等土壤侵入物；修整地形，保持坡度自然流畅。&lt;/p&gt;
&lt;p&gt;表土细作时的注意事项：&lt;/p&gt;
&lt;p&gt;①、耙干不耙湿，必须在土壤达到耕性状态时才操作，以免踏实土壤，破坏土壤结构；&lt;/p&gt;
&lt;p&gt;②、耙土时由前向后，不在耙过的细土上留下脚印（因为每个脚印都是一处毛管水上升的通道），为防止&amp;quot;盐随水上&amp;quot;，于细微处不放过。&lt;/p&gt;
&lt;h4&gt;3、改良土壤&lt;/h4&gt;
&lt;p&gt;（1）、改土的关键：&amp;quot;盐随水来、盐随水去、盐随水上、盐随水下&amp;quot;。&lt;/p&gt;
&lt;p&gt;（2）、改土的原则：统筹兼顾，全面解决好水的问题；综合治理，排盐与培肥土壤结合。全面改善盐碱土的水肥气热状况，提高其生态性。因地、因时、因树制宜科学运用具体措施。&lt;/p&gt;
&lt;p&gt;（3）、改土的措施：&lt;/p&gt;
&lt;p&gt;A、农林水利措施：在争得甲方的同意，同时又不影响主体工程观感效果的前提下，进行开沟排水，同时还要在种植前后反复进行灌溉浇水，通过水的淋洗作用使&amp;quot;盐随水去&amp;quot;，达到排盐的效果。&lt;/p&gt;
&lt;p&gt;B、经常性地中耕松土，冬季还要深耕冻垡，截断土壤毛细管，保持林地表土的疏松、平整、不积水，防止地表径流，促使雨水、灌溉水竖向下渗。&lt;/p&gt;
&lt;p&gt;C、对裸露地的小面积白色盐斑可反复刮除。&lt;/p&gt;
&lt;p&gt;D、培肥土壤：重施有机肥，提高土壤肥力，改善以至优化土壤的生态性，有机肥中的腐殖酸的螯合作用，可减轻盐分中的钠离子危害。&lt;/p&gt;
&lt;p&gt;E、改善土壤结构：施土壤胶结剂、腐殖酸等创造土壤团粒结构，提高生态活性，改善树木的立地条件。&lt;/p&gt;
&lt;p&gt;F、综合运用化学、生物改良措施：增施化学酸性肥如过磷酸钙、硫磺粉、黄铁矿渣等；施有益菌种，种植根瘤菌类植物和绿肥改良土壤。&lt;/p&gt;
&lt;h4&gt;4、放样定点、挖穴&lt;/h4&gt;
&lt;p&gt;（1）、放样定点：用经纬仪网络法放样。先按图纸上每种树木的分布界限用老粉（石灰是强碱性故不能用）或黄砂打出界线。然后由上往下或有内向外放出每株树的栽植点，栽植方式力求自然，在二个树种之间有一个互相融合的交错过度带。每个树种或一种树的不同规格用一种放样标记，以免栽植时混淆。&lt;/p&gt;
&lt;p&gt;（2）、挖穴：以放样确定的栽植点开始挖穴。树穴为圆形或方形，挖穴的树穴直径要求比苗木水平根系或泥球直径大20-30CM，深度要超过泥球高度的20CM以上。&lt;/p&gt;
&lt;h4&gt;5、苗木的栽植：&lt;/h4&gt;
&lt;p&gt;（1）、苗木栽植前的准备：&lt;/p&gt;
&lt;p&gt;A、严格按照设计要求的规格选苗，个别苗木品种我们将适当放大一个档次的规格；选择生长健壮，发育良好，主杆不过于弯曲，树冠茂密，枝条分布均匀，基本成形，无严重损伤和病虫感染，有发达根系的乔木。&lt;/p&gt;
&lt;p&gt;B、苗木移栽前的平衡修剪：&lt;/p&gt;
&lt;p&gt;苗木移栽前修剪是缓和水分失调矛盾，提高树木栽植成活率的重要措施。平衡修剪应根据整形修剪的原则，在不影响苗木形态结构和观赏的前途下进行，以达到地上部分与地下部分在移栽后能长活并正常生长发育的目的。具体如下：&lt;/p&gt;
&lt;p&gt;常绿树木：在掘苗前二、三天先摘去1/3枝叶，种植时采用疏剪与短截办法，再除去1/3的枝叶。&lt;/p&gt;
&lt;p&gt;落叶树木：采用短截主侧枝的延长枝和疏剪辅养枝的方法，对一些主侧枝不宜作短截处理的树种可进行疏枝。&lt;/p&gt;
&lt;p&gt;C、苗木的起挖和运输&lt;/p&gt;
&lt;p&gt;为了提高树木的成活率、提高造林质量，树木的挖掘和运输是至关重要的环节。&lt;/p&gt;
&lt;p&gt;（A）、精心挖掘包装：&lt;/p&gt;
&lt;p&gt;带土球的树苗因基部重心稳固抗风力强，又带了苗圃原土有利于根系生长。常绿树种必须带光泥球进行挖掘，部分移载成活率低的落叶树种也要带光球起挖掘，有些成活率稍低的落叶树种可带毛泥球起挖，对于一些带不了泥球的落叶树种，必须留长根打泥浆处理，防止根部水分蒸发；贵重树种按地径的7~8倍放大土球尺寸。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;media/image1.jpeg&quot; alt=&quot;土球包扎示意图&quot; /&gt;{width=&amp;quot;5.760416666666667in&amp;quot; height=&amp;quot;2.4583333333333335in&amp;quot;}&lt;/p&gt;
&lt;p&gt;确保包扎质量：土球纵向深度取直径的70%，挖掘是根切口要平，不可撕裂，若有难切的大根可用手锯锯断；削去泥球表面浮土，把泥球修整好，取草绳一端栓在树木根茎上，开始扎泥球；一手拉紧草绳，一手用木板拍草绳使之嵌入土中，腰箍草绳紧扎在一起，宽15-20厘米，隔开相同距离，再打一个同样腰箍，然后打网络，第一遍网络也必须拍打入土，再反方向打一网络（见图1）。待双网络打好后，把泥球轻轻向一边倾斜，切断底部树根；泥球扎好后把树杆歪倒，到树冠在一人一手高度范围内，立即进行密枝芽修整。&lt;/p&gt;
&lt;p&gt;（B）、随挖随运，保护运输：大树要用吊车装、卸，吊车和装运车辆的吊、卸重能力必须超过树木和泥球总重量的一倍，装树数目不能太多，大树土球不能重叠，不能超宽、超高；用进口软带吊装，吊带扎在泥球下端，通过泥球重心，树梢用绳子按小于45°的方向挂在钓钩上（见图2）；轻吊轻放。树根放在车头部位，泥球下塞三角木稳住泥球，树杆与车箱拉板接触处衬垫稻草或草包并用绳子缚牢；运输车上有专人押送，遇架空线等障碍时要妥善处理；树冠和树杆上喷蒸腾抑制剂并尽量在夜晚蒸腾作用微弱时运输。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;media/image2.jpeg&quot; alt=&quot;吊装示意图&quot; /&gt;{width=&amp;quot;3.90625in&amp;quot; height=&amp;quot;3.6666666666666665in&amp;quot;}&lt;/p&gt;
&lt;p&gt;对于从外地采购来的苗木，运输途中必须覆盖油布，同时加强病虫害检疫检查，严防检疫性病虫害传人本市。&lt;/p&gt;
&lt;p&gt;（C）、备足人、机、料：&lt;/p&gt;
&lt;p&gt;把栽植树木时要用的辅助材料如草绳、木桩、铅丝、三角带等都备好并运往工地仓库；准备好要使用时的新技术新材料如生根素、愈伤剂的配制和使用用具喷雾器等等；安排好运输车辆、吊车；组织好劳力并完成上岗培训。&lt;/p&gt;
&lt;p&gt;（2）、苗木的栽植&lt;/p&gt;
&lt;p&gt;在同一小区内先种乔木，后载灌木，以林地位置看，先高处、再平地，这样从外面卸车、运输可畅通无阻，种好的树木也不会因后续种植工序的干扰而受损。&lt;/p&gt;
&lt;p&gt;树木栽植深度对移栽后的成活率有很大的影响，栽植深度要恰当，一般与原种植深度相同，在栽植前要根据苗木的根系或泥球的大小，先检查树穴的深浅宽窄。树穴太深可稍加泥土，过浅则可再挖深，过窄可在树穴的四周再放大些。树穴符合标准后，即进行栽植。&lt;/p&gt;
&lt;p&gt;栽植裸根乔木时，根据根系或栽植深度在穴内填入适量表土，苗木放入穴的中央，使根系向四面自然延伸，然后一人用手将树木扶正，另一人填入表土，填到一半时，将树木向上提动一下，使表土能入根际空隙，然后边填土边夯实。&lt;/p&gt;
&lt;p&gt;栽植带土球的乔灌木时，应根据土球大小和厚度，在穴内填入适量的种植土，土球入穴后在土球底部四周填入少量的表土，将土球固定，并使树干保持直立。土球的包装物，如是少量的易腐烂的草绳或稻草之类的扎缚物，可不除去，如量多或不易腐烂，需将扎缚物剪除拿掉，以免日后腐烂发热，影响树木根部的生长，然后填入好的表土，至坑的一半时用力夯实，再边加土边夯实。&lt;/p&gt;
&lt;p&gt;成片栽植时，要先载小树，防止在搬运过程中大树压损小树的现象。&lt;/p&gt;
&lt;p&gt;树木载好后，要浇水，以水分不再向下渗透并有少量积水为准。第二天再复浇一次水，待水分下渗后，将四周土堰铲平，并用松细的干土覆于树干四周穴面上，形成中央高，四周低的覆盆形状。&lt;/p&gt;
&lt;p&gt;科学栽植是提高树木成活率和造林质量的重中之重，有些改良土壤的措施如在栽植时忽略了，以后就无法弥补；错过种植期就会事倍功半；保护措施不力也会功败垂成。总之，必须精心栽植。&lt;/p&gt;
&lt;h4&gt;6、苗木的支撑、绕杆&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;media/image3.png&quot; alt=&quot;支撑示意图&quot; /&gt;{width=&amp;quot;5.770833333333333in&amp;quot; height=&amp;quot;4.375in&amp;quot;}&lt;/p&gt;
&lt;p&gt;对新种的乔木，为了提高它的成活率，减少水分的蒸发，进行草绳绕杆，绕杆至一级分叉点以上，高度控制在2.0M为准（见图3）。&lt;/p&gt;
&lt;p&gt;为了提高树木的抗风作用，需要对其进行支撑，支撑横杆与树杆接触点必须用橡胶软垫衬好，以保证树皮不受损伤，然后再用橡胶带绑扎牢固。养护中应该经常检查，绑扎是否松动或太紧，及时进行修整。树木的支撑方法很多，我公司在本工程中，对于种植在树穴中的广玉兰等大规格树木将采用四脚桩支撑（见图5），部分种植于空地上的树木将采用钢索吊桩（见图4）。&lt;/p&gt;
&lt;h4&gt;7、灌木、地被植物栽植&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;media/image4.jpeg&quot; alt=&quot;灌木栽植&quot; /&gt;{width=&amp;quot;3.125in&amp;quot; height=&amp;quot;3.25in&amp;quot;}&lt;/p&gt;
&lt;p&gt;选择品种纯正、树型饱满不脱脚、无杂草及病虫害、种植高度均匀一致的灌木。对矮灌木的质量要严格检查、检疫，种植前要翻松土壤，挖透有效土层，用种花刀铲开经过细作的表土，深度以埋至原土球顶部为度，种植密度均匀，高低排铺整齐；用种花刀柄把埋根细土捣实；浇透水，发现有歪株时，在土壤稍干后扶正加土；扶正后及时用修枝剪初步修剪整平；待缓苗后再进行精细修剪，只到符合设计要求。&lt;/p&gt;
&lt;h4&gt;8、草皮的种植&lt;/h4&gt;
&lt;p&gt;在草皮基地内选择生长旺盛、叶片厚大、无杂草、无病虫害的优质草皮，用璨铲铲出30*30CM的块状，铲出的草皮厚薄要求均匀。成捆包装，轻装轻放。在铺植之前，先将地面整好，细作，把树坑周围地面作成泛水坡面，将整张的草皮铺贴到地面上，草块与草块的间隙不得超过1.5CM，间隙均匀，浇水要浇透，浆水拍实，使草皮底部和泥土紧密结合。&lt;/p&gt;
&lt;h4&gt;9、工程扫尾和缺陷补救&lt;/h4&gt;
&lt;p&gt;所有树木(包括灌木)如期栽植完毕后,进入迎接完工验收阶段,此时工作量虽然不大,然而&amp;quot;行百里者半九十&amp;quot;,必须认真对待,以求工程第一阶段的善始善终.要做好下列工作:&lt;/p&gt;
&lt;p&gt;(1)、检查所有树木生长情况，如有黄叶现象先在叶面喷施光合促进剂（STP光合菌营养液）和低浓度叶面追肥（0.1-0.2%浓度的KH2PO4+尿素）；如仍无好转甚至转向枯萎既拔掉另种。另种时要检查树穴情况，找到死树原因。我们要做到&amp;quot;三不放过&amp;quot;（不查明原因、不吸取教训、不找出补救措施不放过）的精神对待每一株死树、萎树，有树木缺档统统布齐。&lt;/p&gt;
&lt;p&gt;（2）、检查所有支撑桩，若有歪斜、松动，全部扶正、扎紧。&lt;/p&gt;
&lt;p&gt;（3）、做好林地平整和清洁工作。&lt;/p&gt;
&lt;p&gt;（4）、保持排水系统通畅。&lt;/p&gt;
&lt;p&gt;（5）、编制好竣工资料，做到图纸整洁、资料完整。&lt;/p&gt;
&lt;h4&gt;10、加强新种树木的养护和管理&lt;/h4&gt;
&lt;p&gt;&amp;quot;三分种，七分养&amp;quot;，养护管理措施相当重要。我单位将采取相应措施具体如下：&lt;/p&gt;
&lt;p&gt;（1）、灌溉和排水&lt;/p&gt;
&lt;p&gt;灌溉：根据土壤&amp;quot;墒情&amp;quot;及时灌溉，水量适当，既要浇透又不可水分过多，以防接通底土毛管水而引起返盐。第二天上午，立即松土，以切断上部毛细管，减少土表水蒸发。&lt;/p&gt;
&lt;p&gt;排水：严格保持林地排水通畅，大雨后及时排出局部积水，每株大树都要避免雨后根部淹水，避免积水。&lt;/p&gt;
&lt;p&gt;（2）、中耕除草&lt;/p&gt;
&lt;p&gt;在生长旺季，每月松土除草1~2次，树木根部附近土壤要保持疏松，易板结的土壤在蒸腾旺盛季节每月松土一次。中耕除草应选在晴朗或初晴天气，土壤不过分潮湿的时期进行。&lt;/p&gt;
&lt;p&gt;（3）、施肥&lt;/p&gt;
&lt;p&gt;施肥是保证绿化树木旺盛生长的不可替代的养护要点之一。在盐碱地区要多施有机肥、生理酸性或化学肥料，如硫磺胺、硫磺钾（生理酸性）、过磷酸钙（化学酸性）。不可使用碱性肥料（砻糠灰、碳胺等）和含氯离子的肥料（氯化铵、绿化钾）。乔、灌木入冬前以猪粪、鸡粪等腐熟的有机肥或迟效颗粒（注）施基肥。&lt;/p&gt;
&lt;p&gt;（注）：迟效颗粒肥： N:P:K=1:1:1；&lt;/p&gt;
&lt;p&gt;施用量： 大树 250克/株，小树 50克/株，灌木 50克/株&lt;/p&gt;
&lt;p&gt;（4）、病虫害防治：贯彻&amp;quot;以防为主，综合治理&amp;quot;的方针，大力推行生物防治和无公害防治法。&lt;/p&gt;
&lt;p&gt;（5）、抗台及紧急情况抢救措施：高大乔木等在台风来临前夕，应以&amp;quot;以防为主，综合防治&amp;quot;的原则。对树木存在根浅、迎风、枝叶过密要根据时间情况分别采取绑扎、加土、扶正、疏枝、加桩等几项综合措施。&lt;/p&gt;
&lt;p&gt;绑扎：是一项临时措施，宜采用8号铅丝或绳索绑扎树杆，绑扎点应衬垫橡皮，不得损伤树枝，另一端必须固定；也可多株串联起来再行固定。&lt;/p&gt;
&lt;p&gt;加土：树穴内的土壤，出现低洼和积水现象时，必须在风暴来临前加土，使根系周围的土保持馒头状。&lt;/p&gt;
&lt;h4&gt;11、工程移交验收&lt;/h4&gt;
&lt;p&gt;×××景观园林绿化工程有限公司&lt;/p&gt;
&lt;h2&gt;安全生产措施&lt;/h2&gt;
&lt;p&gt;一、落实安全生产责任制；&lt;/p&gt;
&lt;p&gt;二、组织进行安全三级教育；&lt;/p&gt;
&lt;p&gt;三、健全分部分项安全技术交底；&lt;/p&gt;
&lt;p&gt;四、特种作业持证上岗；&lt;/p&gt;
&lt;p&gt;五、安全教育；&lt;/p&gt;
&lt;p&gt;六、工种事故处理；&lt;/p&gt;
&lt;p&gt;七、&amp;quot;五牌一图&amp;quot;与安全标牌；&lt;/p&gt;
&lt;p&gt;八、落实安全用电制度；&lt;/p&gt;
&lt;p&gt;九、落实放火、防盗安全制度；&lt;/p&gt;
&lt;p&gt;十、健全安全管理网络。&lt;/p&gt;
&lt;p&gt;×××景观园林绿化工程有限公司&lt;/p&gt;
&lt;h2&gt;工期保证措施&lt;/h2&gt;
&lt;p&gt;1、组建以公司领导为核心的工程指挥部，协调落实监督各项计划的实施，现场成立项目管理部，保证各项计划的实施。&lt;/p&gt;
&lt;p&gt;2、精心组织、精心施工，拟定切实可行的施工进度计划。层层分解落实，做到既有长远计划，又有短期目标，使用我公司行之有效的管理网络，确保定计划的实现。&lt;/p&gt;
&lt;p&gt;3、在劳力物力方面安排要富余，让计划有提前的余地。&lt;/p&gt;
&lt;p&gt;4、加强后勤保障措施，保证水电供应连续。&lt;/p&gt;
&lt;p&gt;5、搞好工地宣传，以增强全体人员的责任感，荣誉感，激励斗志，使他们全力以赴投入到工程建设中去。&lt;/p&gt;
&lt;p&gt;×××景观园林绿化工程有限公司&lt;/p&gt;
&lt;h2&gt;文明施工规划&lt;/h2&gt;
&lt;p&gt;由于本工程施工地点是在重要交通路口，是兴化市标志性工程、窗口工程，因此如何抓好文明生产、文明施工至关重要，具体措施如下：&lt;/p&gt;
&lt;p&gt;1、根据建委、建管处要求，建立项目经理负责制，实行&amp;quot;宣传&amp;quot;、&amp;quot;教育&amp;quot;、&amp;quot;检查&amp;quot;、&amp;quot;整改&amp;quot;制度，争创文明工地，班组长应加强材料管理，确报随报随做随清，物尽其用，禁止乱扔乱抛，制定相应考核制度，对各工作要定期检查评分。&lt;/p&gt;
&lt;p&gt;2、现场实行封闭式作业，围护栏网按创建要求设置，在醒目处设立工程效果图，搞好&amp;quot;四图一牌&amp;quot;，现场设立警示标志和宣传牌，并做到牌图规格统一、字迹清楚、色彩清晰。&lt;/p&gt;
&lt;p&gt;3、现场设立专责负责人，确保道路畅通、平坦整洁、材料机械不乱堆乱放乱停，场内无散落物，场地平整无积水，施工垃圾集中堆放，及时处理。&lt;/p&gt;
&lt;p&gt;4、严格按市场规定进行施工，污水排放按环保要求执行。&lt;/p&gt;
&lt;p&gt;5、积极开展施工现场综合管理业绩考评，对质量安全，现场文明齐抓共管，确保本工程顺利完成。&lt;/p&gt;
&lt;p&gt;×××景观园林绿化工程有限公司&lt;/p&gt;            </description>
            <pubDate>2026-05-14 05:08:56</pubDate>
            <link>https://www.syuez.com/blog/%E5%9B%AD%E6%9E%97%E5%B7%A5%E7%A8%8B%E6%8A%95%E6%A0%87%E4%B9%A6%E4%B8%93%E4%B8%9A%E7%89%88.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%9B%AD%E6%9E%97%E5%B7%A5%E7%A8%8B%E6%8A%95%E6%A0%87%E4%B9%A6%E4%B8%93%E4%B8%9A%E7%89%88.html</guid>
                                               <category>招投标</category>
                                    </item>
                <item>
            <title>SQL汇总统计： 在SQL中使用CUBE和ROLLUP实现数据多维汇总</title>
            <description>
            &lt;!--
author: 时光与字节
date: 2022-12-13
title: SQL汇总统计： 在SQL中使用CUBE和ROLLUP实现数据多维汇总
tags: SQL,MySQL
category: Program
status: publish
summary: SQL 太复杂了
--&gt;
&lt;h1&gt;SQL汇总统计： 在SQL中使用CUBE和ROLLUP实现数据多维汇总&lt;/h1&gt;
&lt;h4&gt;前言&lt;/h4&gt;
&lt;p&gt;偶然在网上看到一篇文章，讲到数据汇总，提到了CUBE，感觉有些晦涩，想试着自己表述一下。同时，个人也认为CUBE还是很有用的，对SQL或数据分析感兴趣的小伙伴不妨了解一下，或许有用呢！&lt;/p&gt;
&lt;p&gt;首先，我们设定个需求，想要分别按【性别】、【籍贯】、【年龄】或【成绩级别】统计下表中学生的数量，再进一步，需要将这些条件相结合统计，同时满足某两项或更多条件的学生数量。数据表格如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/dfcb5171-2eb0-4e0b-9ff5-64239181be20.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们可以逐层来理解【GROUP BY】【WITH ROLLUP】【WITH CUBE】如何完成数据汇总。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;第一层：&lt;/strong&gt;【&lt;strong&gt;GROUP BY&lt;/strong&gt;】&lt;/h4&gt;
&lt;p&gt;【GROUP BY】从字面意义上理解就是根据【BY】指定的规则对数据进行分组，所谓的分组就是将一个“数据集”划分成若干个“小区域”，然后针对若干个“小区域”进行数据处理。可以先利用【GROUP BY】按条件进行分组，然后计算各组的数量。看个例子。&lt;/p&gt;
&lt;p&gt;按学生性别统计学生的数量，SQL语句如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT 性别, COUNT(学号) AS 数量  
FROM STUDENT
GROUP BY 性别&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/v2-2971c9621cb1c28903b658e7edd4329d_720w.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;结果分析：可以看出，已经按性别顺利统计出“男”、“女”各占的数量，但这距离事先的需求（要统计多个条件，甚至是多条件组合下的学生数量的小计以及合计）差距有点远，【GROUP BY】还是有点弱。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;第二层：&lt;/strong&gt;【&lt;strong&gt;GROUP BY】+【WITH ROLLUP】&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;为【GROUP BY】加上【WITH ROLLUP】子句，看ROLLUP能不能提供更多的统计结果。前面说到多条件，其实说多维度更准确些。看个例子先：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--语句1 只用了【性别】一个维度进行汇总
SELECT 性别,  COUNT(学号) AS 数量
FROM STUDENT
GROUP BY 性别 WITH ROLLUP

--语句2 用了【性别】和【籍贯】两个维度进行汇总
SELECT 性别, 籍贯, COUNT(学号) AS 数量
FROM STUDENT
GROUP BY 性别, 籍贯 WITH ROLLUP

--语句3 用了【性别】、【籍贯】、【年龄】三个维度进行汇总
SELECT 性别, 籍贯, 年龄, COUNT(学号) AS 数量
FROM STUDENT
GROUP BY 性别, 籍贯, 年龄 WITH ROLLUP&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/df3f70ee-6c68-44f5-a50a-9b512329cf5d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;结果分析：可以看出，ROLLUP 提供了更多的统计数据，并且在结果中包含了很多“NULL”值的数据行，其实这些含“NULL”的数据行就是 ROLLUP 提供的汇总项，再仔细分析一下，不难看出，ROLLUP 计算了指定分组（就是汇总的维度）的多个层次的数量小计以及合计，先逐步创建高一级别的小计，最后再创建一行总计。整体结果都是以【性别】这一层次进行数据聚合（这也是与 CUBE 的不同之处）。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;第三层：&lt;/strong&gt;【&lt;strong&gt;GROUP BY】+【WITH CUBE】&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;还有没有更多组合的数据聚合，CUBE可以提供所选择列的所有组合的聚合。简单说，CUBE生成的结果是个多维数据集，就是包含各个维度的所有可能组合的交叉表格。看个例子：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--语句只用了【性别】和【籍贯】两个维度进行汇总
SELECT 性别, 籍贯,  COUNT(学号) AS 数量
FROM STUDENT
GROUP BY 性别, 籍贯 WITH CUBE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/c1094e08-3bf6-45d1-bb54-e0a75cc4a1e4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;结果分析：与上面的 ROLLUP 的结果进行对比，是不是可以看到更多的结果数据。不仅有性别的小计，还有籍贯的小计。CUBE 可以为指定的列创建各种不同组合的小计，是一种比 ROLLUP 更细粒度的分组统计语句。如果将统计维度调整到三个维度，会与 ROLLUP 有更大的差异，三个维度下的 CUBE 结果有点多，篇幅有限，就用个GIF 展示下，感兴趣的小伙伴可以自己试一下。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/v3-8c95148eb1932431856d185dce5836a5_b.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后，引用一下书面的总结，CUBE 和 ROLLUP 之间的区别在于：&lt;/p&gt;
&lt;p&gt;CUBE 生成的结果集显示了所选列中值的所有组合的聚合。&lt;/p&gt;
&lt;p&gt;ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。&lt;/p&gt;
&lt;p&gt;感觉也可以这样来说：ROLLUP 就是将 GROUP BY 后面的第一列名称求总和，而其他列并不要求，而 CUBE 则会将每一个列名称都求总和。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：&lt;a href=&quot;https://zhuanlan.zhihu.com/p/68467070&quot;&gt;SQL汇总统计： 在SQL中使用CUBE和ROLLUP实现数据多维汇总 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SQL%E6%B1%87%E6%80%BB%E7%BB%9F%E8%AE%A1_%E5%9C%A8SQL%E4%B8%AD%E4%BD%BF%E7%94%A8CUBE%E5%92%8CROLLUP%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E5%A4%9A%E7%BB%B4%E6%B1%87%E6%80%BB.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SQL%E6%B1%87%E6%80%BB%E7%BB%9F%E8%AE%A1_%E5%9C%A8SQL%E4%B8%AD%E4%BD%BF%E7%94%A8CUBE%E5%92%8CROLLUP%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E5%A4%9A%E7%BB%B4%E6%B1%87%E6%80%BB.html</guid>
                                               <category>Program</category>
                                    </item>
                <item>
            <title>SQL多表查询：SQL JOIN连接查询各种用法总结</title>
            <description>
            &lt;!--
author: 时光与字节
date: 2022-12-13
title: SQL多表查询：SQL JOIN连接查询各种用法总结
tags: SQL,MySQL
category: Program
status: publish
summary: SQL 太复杂了
--&gt;
&lt;h1&gt;SQL多表查询：SQL JOIN连接查询各种用法总结&lt;/h1&gt;
&lt;h3&gt;前言&lt;/h3&gt;
&lt;p&gt;在实际应用中，大多的查询都是需要多表连接查询的，但很多初学 SQL 的小伙伴总对各种 JOIN 有些迷糊。回想一下，初期很长一段时间，我常用的似乎也就是等值连接 WHERE 后面加等号，对各种 JOIN 也是不求甚解，今天索性就来个 JOIN的小总结。&lt;/p&gt;
&lt;p&gt;首先，设定两张表，作为下面例子的操作对象。&lt;/p&gt;
&lt;p&gt;表1 学生信息表&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/4e0e90ad-1f5f-436c-a795-b65e93fdf989.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;表2 专业班级表&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/45900233-d29a-4c9c-8d89-b7deab71dd95.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;再来个SQL JOIN连接查询各种用法的大合影，先预热一下。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/f4dd913c-1511-49a1-8204-b2e384369bcf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;No.1 【 INNER JOIN】内连接&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;这是最常用的，获取两个表中指定字段满足匹配关系的记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/f99d3890-8ecf-4d31-8c70-78e46f787169.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;内连接通常有两种情况：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;等值连接&lt;/strong&gt;：查找两个表中连接字段相等的记录。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--查询每个学生的学号、姓名、籍贯、年龄、专业、班级
--涉及到student和major两张表，用共有字段“学号”为连接字段

--写法1：使用INNER JOIN
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A
INNER JOIN major B   
ON  A.学号=B.学号

--写法2：--省去了INNER，直接写JOIN，与INNER JOIN没有区别
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A
JOIN major B  
ON  A.学号=B.学号

--写法3： --使用WHERE，已经逐渐被淘汰
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A, major B
WHERE A.学号=B.学号 

--上面三种写法的结果都是一样的，推荐使用写法2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/7c0cd80b-8b5e-4af7-a188-860f88f42438.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自身连接&lt;/strong&gt;：就是和自己进行连接查询，给一张表取两个不同的别名，然后附上连接条件。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--要在学生表里查询与 HH 同龄且籍贯也相同的学生信息

SELECT B.学号, B.姓名, B.性别, B.籍贯, B.年龄
FROM student A 
JOIN student B
ON A.年龄=B.年龄 AND A.籍贯=B.籍贯 AND A.姓名=&#039;HH&#039;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/f59aba26-925f-4445-bc0d-ab21a5f50c20.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;No.2 【LEFT JOIN】左连接&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;获取左表中的所有记录，即使在右表没有对应匹配的记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/f59ddd1f-ed10-4d7d-a96f-435ef46b1d5e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--左连接：显示左表student所有记录，如右表中没有与之
--匹配的项则以NULL值代替。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A LEFT JOIN major B  
ON  A.学号=B.学号&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/0772798a-365c-4507-a634-67ae3ed462bd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;No.3 【RIGHT JOIN】右连接&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;用于获取右表中的所有记录，即使左表没有对应匹配的记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/7567c036-a7e1-44a2-87a0-7a3c7ce9a9ae.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--右连接：显示右表major所有记录，如左表中没有与之
--匹配的项则以NULL值代替。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A RIGHT JOIN major B  
ON  A.学号=B.学号&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/3d88f6b0-89f3-4c03-b21e-b26ff0815dc6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;No.4 【FULL JOIN】 完全连接&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;返回两个表中的所有行。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/6cf12f36-9810-48a7-90dd-6d081ffcb035.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--完全连接：显示两张表的并集，如果其中一张表的记录
--在另一张表中没有匹配的行，则对应的数据项填充NULL

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A FULL JOIN major B  
ON  A.学号=B.学号&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/c5597804-5c61-4b4c-a552-3681e1baec67.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;No.5 【 CROSS JOIN】交叉连接&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;结果是笛卡尔积，就是第一个表的行数乘以第二个表的行数。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/c310c091-4004-4ecd-824e-c86db7ea67e0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--交叉连接：一张表中的数据依次取出分别与另一张表中的
--每条数据挨个组合，最后记录数量为两张表记录数的乘积

SELECT * FROM student CROSS JOIN major

--本例student和major都为7条记录，所以结果为7*7=49条记录&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/v2-dd567fe9dcef9e2a77cb14cd6054c329_b.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;No.6 延伸【Left Excluding JOIN】左表唯一&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;返回左表有但右表没有关联数据的记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/ee580181-bf0e-47ad-a33d-5598fd506eec.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--左表唯一：将右表B以及两张表交集的部分过滤掉，
--得到的记录是左表中唯一存在的。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A LEFT JOIN major B  
ON  A.学号=B.学号
WHERE B.学号 IS NULL&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/def2cd99-2f84-4308-8e7e-f40345853b36.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;No.7 延伸【Right Excluding JOIN】右表唯一&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;返回右表有但左表没有关联数据的记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/d6bef18c-2087-4fd9-bb6f-4966a4d4ef72.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--右表唯一：将左表A以及两张表交集的部分过滤掉，
--得到的记录是右表中唯一存在的。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A RIGHT JOIN major B  
ON  A.学号=B.学号
WHERE A.学号 IS NULL&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/1ab9bcb1-bbe1-4027-ac15-f6688956e66b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;No.8 延伸【 Outer Excluding JOIN】非交集连接&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;返回左表和右表里没有相互关联的记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/24c78498-dfde-4e5a-b1e8-87d2b9d5602b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--非交集连接：查找两张表中没有关联的记录项。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A FULL JOIN major B  
ON  A.学号=B.学号
WHERE A.学号 IS NULL OR B.学号 IS NULL&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/d2fbce8b-c7d7-43e7-8983-26dcbec36600.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;最后&lt;/h3&gt;
&lt;p&gt;谈及 SQL 里的各种 JOIN 之间的区别时，被广为引用的是 CodeProject 上C.L. Moffatt的文章, 本文也有所参考，感兴趣的小伙伴可以去看一下。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins&quot;&gt;Visual Representation of SQL Joins - CodeProject&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/68136613&quot;&gt;SQL多表查询：SQL JOIN连接查询各种用法总结 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SQL%E5%A4%9A%E8%A1%A8%E6%9F%A5%E8%AF%A2_SQL_JOIN%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A2%E5%90%84%E7%A7%8D%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SQL%E5%A4%9A%E8%A1%A8%E6%9F%A5%E8%AF%A2_SQL_JOIN%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A2%E5%90%84%E7%A7%8D%E7%94%A8%E6%B3%95%E6%80%BB%E7%BB%93.html</guid>
                                               <category>Program</category>
                                    </item>
                <item>
            <title>为啥 Erlang 没有像 Go、Scala 语言那样崛起？</title>
            <description>
            &lt;!--
author: yuheng.io
date: 2022-11-15
title: 为啥 Erlang 没有像 Go、Scala 语言那样崛起？
tags: 编程,并发
category: Program
status: publish
summary: 你就是要用普通人不用的东西才能战胜普通人
--&gt;
&lt;h1&gt;为啥 Erlang 没有像 Go、Scala 语言那样崛起？&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://dreamsongs.com/RiseOfWorseIsBetter.html&quot;&gt;Worse is Better)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;能比较好地解释题主的「为什么」。注意这篇文章的写作背景，这是一位 LISP 大佬在九十年代初反思为什么 LISP 这么牛的语言日渐式微，C 和 UNIX 这么烂的东西却起来了。概括下来大概是这样的：&lt;/p&gt;
&lt;p&gt;软件设计有以下四大目标：简单、正确、一致、完整，但两大流派 MIT Style (MIT AI Lab 是 LISP 重镇) 和 New Jersey Style (C 和 UNIX 的老家贝尔实验室所在地) 对这些目标的优先级排序不同。MIT Style 认为软件正确性要绝对保证，然后优先级是：正确 ≈ 一致 &amp;gt; 完整 &amp;gt; 简单。简单这一条还得分，为了接口简单，可以忍受实现复杂。而 New Jersey Style 是正好反过来：首先软件实现得简单，做不到宁愿让接口复杂点，为了简单显然可以牺牲完整性，而正确、一致，那就尽力吧…… 反正得简单。Worse is Better 前面的 Worse 指的就是像 UNIX 这样为简单甚至能放弃「正确」这种有绝对标准的好的东西，后面的 Better, 指的是更好的生存适应性，这里面不带价值判断，文章作者也为 &amp;quot;Worse Is Better Is Worse&amp;quot; or &amp;quot;Worse is Better is Still Better&amp;quot; 一直在纠结，但这是一个能解释很多现象的准确观察。&lt;/p&gt;
&lt;p&gt;没错，Erlang 就是 MIT Style, do the right thing 那个。它跟 LISP 一样产生深远的影响，会被无数后世语言技术借鉴 —— 即使不用 Erlang 开发我还是会对每个新人都会高度推荐 [Erlang paper](&lt;a href=&quot;http://erlang.org/download/armstrong_thesis_2003.pdf&quot;&gt;armstrong_thesis_2003.pdf (erlang.org)&lt;/a&gt;) ——— 可是能火起来的，还是那帮新泽西佬做出来的敢连 generics 都没有的烂货。&lt;/p&gt;
&lt;p&gt;一个东西火起来的关键在于传播。文章把 C 和 UNIX 比作病毒：它实现（而不是接口）很简单，所以能很容易移植（感染）到别的平台，迅速跟原有平台的东西整合，因为它东西少，不拘泥于「正确」、「本质」之类的东西，能根据平台和需求快速演化，也能不断吸(chao)收(xi) 别人的东西让自己变得更强大。 &lt;/p&gt;
&lt;p&gt;但是 Erlang 不行，阻碍 Erlang 传播的除了爱立信作死，还有它自己的特性。A History of Erlang 里数次提到，Erlang 很难移植到别的语言/运行平台，因为 Erlang 的运行模型太特别了（真可惜只有Erlang是对的），所有一切都只能自己搞，同样原因导致要调用宿主平台的原有模块也很困难。Erlang 有一个简单、正确、不妥协的接口，但是底层实现就不得不非常复杂精巧，当底层实现的优化都不能满足你的特定需求时，你很难绕过统一美好的模型做 case by case, quick and dirty 的优化。某个算法 Erlang 跑太慢了你要引入 C 模块，难（望向 PHP &amp;amp; Python），复制消息传递通常不是瓶颈但如果变成瓶颈能传指针么？NO, YOU&#039;RE DOING IT WRONG! 当然实际上 Erlang 内部对这个是有优化的，大的 binary 会自动变一个引用计数 buffer 放共享堆然后就只用传引用啦，但是这马上导致一个问题，因为 Erlang 没有（&lt;strong&gt;不需要有&lt;/strong&gt;）全局 GC, 如果有进程已经不引用这个 binary, 但因为各种原因触发 GC 迟了，共享 heap 里引用计数一直不清零这段 binary 就僵在那，流量冲击大你就等OOM吧，这是实际线上系统会碰到的问题，Binary是不是 refc 又不是你说了算，所以还是时不时自己强行 GC 一下…… 这其实就是一个接口简单导致实现复杂优化困难并且难以做对结果还是要用户自己动手的例子。Go 的 STW GC 虽然简陋，但它不限模型，鼓励复制但不禁止传指针，对这种少数的 case 很容易解决，再拿个 pool 来对付一下蠢萌的 GC 就可以了。模型不纯粹，实现极简陋，但解决问题。  &lt;/p&gt;
&lt;p&gt;Worse is Better 也能解释别的语言或技术的崛起。你不用很优秀但要有一个点做得好，打到痛点，你不用设计完美但至少别犯大错，然后保持简单，保证好上手易移植易与现有系统整合，就可以了，包括 PHP（别打我），它架构上首先基于 CGI: 每个请求一个独立进程，share nothing，只用管道跟 httpd 通信，这天然保证错误隔离，也让 CGI 应用完全不需要管网络交互问题，短连接模型处理完请求就进程结束所以 PHP 甚至不需要 GC, memory pool 就行，更重要的是它也天然支持了热替换。你可以说这些全部是 Erlang 的设计点，也完全符合 Erlang paper 提倡的把困难问题（HTTP server）做成框架让业务写得简单轻松的思路，同时这也是传统的 UNIX 编程方式—— 这就是所谓设计上别犯大错。然后再做一个亮点：直接 HTML 代码里嵌入脚本，现在你觉得这很傻，但当时互联网刚起来，HTML 还是新鲜事物，更没有什么 AJAX, 不用你自己组装字符串直接把代码嵌到 HTML 里太打动人心了。是，这没什么难的，但别人没有，PHP 有。至于一台机撑多少连接？速度怎么样？当时有个人访问你网页你都兴奋半天了，谁跟你研究这种吃撑了怎么办的问题？&lt;/p&gt;
&lt;p&gt;如果 Worse is Better 作为一个定律是正确的，这听起来很可悲，我们就活该没有好东西用了。我感觉可以稍微修正一下：对于开发技术这种存在网络效应的东西，除非一个方案有革命性的优势，否则都会服从 worse is better 定律。&lt;/p&gt;
&lt;p&gt;在电信行业，Erlang 可能真的拥有革命性的优势，我不熟悉的领域不评论，可惜电信行业本身相对狭窄封闭再加上爱立信作死，没网络效应可言。而在其他地方，革命性的优势，它没有。&lt;/p&gt;
&lt;p&gt;开发效率方面，&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;//www.zhihu.com/people/dcddea61834f6b2dcb515f393fe29575&quot;&gt;@bhuztez&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;提到的好 8 倍，我记忆中来自 A History of Erlang 描述一个早期项目，对比对象是一个没什么公开信息的内部语言 PLEX，而且 Joe 说了原始文件从未公开，且当时内部争议就很大；Erlang 标志性项目 AXD 301 的报告结论 (&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.erlang.se/publications/Ulf_Wiger.pdf&quot;&gt;&lt;a href=&quot;http://www.erlang.se/publications/Ulf_Wiger.pdf&quot;&gt;http://www.erlang.se/publications/Ulf_Wiger.pdf&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;) 是 4 倍，对比对象是 C/C++，方法是对比代码长度（所有动态脚本语言都能赢好吗）和bug密度（相同），更重要的是，它并没有分析 Erlang 的语言特性在开发效率提高中的必然作用，甚至没有代码对比样例（报告里倒是有一堆组织架构管理方法内容），也没说明有 C++ 使用什么能跟 OTP 对应的框架，这种论据拿到知乎上是会被喷死的。  &lt;/p&gt;
&lt;p&gt;运行时方面，Erlang 的高并发只能说它是生不逢时。90年代，除了电信领域，这种高并发需求实在没有，要真有，QQ算？人家用 UDP 木有连接保持问题。当时的硬件情况，机械硬盘、网络带宽、CPU 内存逐个撑死了都还没轮到并发。Telnet-based BBS 是 TCP 长链接模型，用最基本的 UNIX fork 进程模型（操作系统级进程隔离，要不是这样那十几二十万行sh*t还真跑不起来），中山大学逸仙时空用一台 98 年的 HP Alpha（以前的DEC）机器 2G 内存好像？能撑 3000 在线，水木 PTT 等大站有好硬盘好 CPU 4G 乃至 8G 内存20000在线不在话下，注意是在线，发呆会被踢的，所以这些连接的活动率很高（作为对比 AXD 301 用的是 Sparc Ultra 2 跑 Solaris 活跃进程有200-4000）。系统的瓶颈一是硬盘二是内存，远远没轮到模型问题。到编程模型真有问题的时候，Worse is Better 已经发挥作用，各种现有开发平台借鉴 Erlang 模型可以搞出很好的东西 —— 为什么是借鉴而不是直接用 Erlang? 答案 Joe 自己已经说了，他在 erlang paper里鼓励 &lt;strong&gt;separate of concern&lt;/strong&gt;, 框架模型这么复杂的东西应该由专业人士一次过搞定，模型之上的应用就很轻松而且根本不用关注并发问题；在 A History of Erlang 中，他提到一个想法，Erlang 是一个运行平台，进程里跑的是什么语言并没有太大关系。那也就是说，虽然用别的语言山寨一个并发运行环境很难（而且很难做对），但是这只是一个一次性的工作而且可以根据业务特性定制，框架完成后，你还是可以用熟悉的语言写业务，完全不用管并发问题，但同样能达到好很多的并行度（所谓 Actor / Reactor 模型 blah blah blah, 或者像 MapReduce 这种特定框架），而且只需要对少数关键模块动手而不是全局替换，性价比高很多吧。&lt;/p&gt;
&lt;p&gt;分布式支持的故事也一样，Erlang 从原理上天然支持分布式，也很早就有了内置分布式支持。然而，这个支持所基于的假设也一样老：几个到十几个节点，均质且可靠全互联的网络，单一的全 Erlang 系统。Joe 怎么也不会想到有人要用几万台破 PC 做集群还妄想跨洲跨机房热备。到我们真的需要分布处理能力的时候，你会发现实现的设计假设限制了它的扩展性(&lt;a href=&quot;http://release-project.softlab.ntua.gr/documents/ifl12.pdf&quot;&gt;ifl12.pdf (ntua.gr)&lt;/a&gt;)，CAP 的基本限制在，不可能有一致、透明的分布式通信和状态管理方案(&lt;a href=&quot;http://erlang.org/pipermail/erlang-questions/2015-December/087198.html&quot;&gt;[erlang-questions] State Management Problem&lt;/a&gt;)  &lt;/p&gt;
&lt;p&gt;这个 thread 可以看到最后 Robert Virding 的总结陈词），你还得去连不按 Erlang 规则来的别的服务，你也没法把 mnesia 扩展到 GFS 的规模，因为它根本不是为这个设计的，Erlang 的这些先发优势没有变成劣势已经很不错了。现在回去看 GFS 和 MapReduce 的论文，你会觉得他们简陋得可笑，里面大篇幅的 fault tolerence 的东西，都是 Erlang 设计原则的特化和简化，可是至少在那时，Erlang 没有发挥它的威力，而 New Jersey guys 蛮干硬上把东西做出来了。你甚至可以认为整个 Google 集群管理系统 Borg 就是一个大号 Erlang 平台，一堆 supervisor 在管着一堆 share nothing RPC 消息通信随时会挂的服务（流行用语叫 micro service），绝大部分服务无状态可以随时挂，Goolge C++ 不允许抛异常但是规定你如果发现完全没预料到的东西你应该直接打 log crash 掉等重启处理，自动均衡部署容灾一应俱全，几乎无限扩展，处处闪耀着 Erlang 的思想光芒，但它们都是用 C++ 写的。开源版 Kubernets 就是 Go 了，Go 没有内置分布式支持，因为整个体系在，它自己已经不需要了。&lt;/p&gt;
&lt;p&gt;这完全就是 Worse is Better 的原文：“The good news is that in 1995 we will have a good operating system and programming language; the bad news is that they will be Unix and C++.”&lt;/p&gt;
&lt;p&gt;最后还是多嘴一句，这不是说我们就不应该用 Erlang. Paul Graham 在&lt;/p&gt;
&lt;p&gt;[Beating the Averages](&lt;a href=&quot;http://www.paulgraham.com/avg.html&quot;&gt;Beating the Averages (paulgraham.com)&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;里提到，Common Lisp 是他当年创业的秘密武器，让他们获得了比用 C++ 或 Java 等竞争对手高的多的开发效率。没人用又怎样？你就是要用普通人不用的东西才能战胜普通人。同样的，如果你相信 Erlang 是你能打败庸众的秘密武器，Go for it (pun NOT intended).&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;a href=&quot;https://www.zhihu.com/question/38032439&quot;&gt;为啥 Erlang 没有像 Go、Scala 语言那样崛起？ - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%B8%BA%E5%95%A5Erlang%E6%B2%A1%E6%9C%89%E5%83%8FGo_Scala_%E8%AF%AD%E8%A8%80%E9%82%A3%E6%A0%B7%E5%B4%9B%E8%B5%B7.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%B8%BA%E5%95%A5Erlang%E6%B2%A1%E6%9C%89%E5%83%8FGo_Scala_%E8%AF%AD%E8%A8%80%E9%82%A3%E6%A0%B7%E5%B4%9B%E8%B5%B7.html</guid>
                                               <category>Program</category>
                                    </item>
                <item>
            <title>为什么使用通信来共享内存</title>
            <description>
            &lt;!--
author: admin
date: 2022-11-14
title: 为什么使用通信来共享内存
tags: 编程,并发
category: Program
status: publish
summary: 不要用多线程，除非发生了等待
--&gt;
&lt;h1&gt;为什么使用通信来共享内存&lt;/h1&gt;
&lt;p&gt;『不要通过共享内存来通信，我们应该使用通信来共享内存』，这是一句使用 Go 语言编程的人经常能听到的观点，然而我们可能从来都没有仔细地思考过 Go 语言为什么鼓励我们遵循这一设计哲学，我们在这篇文章中就会介绍为什么我们应该更倾向于使用通信的方式交换消息，而不是使用共享内存的方式。&lt;/p&gt;
&lt;h3&gt;概述&lt;/h3&gt;
&lt;p&gt;使用通信来共享内存其实不只是 Go 语言推崇的哲学，更为古老的 Erlang 语言其实也遵循了同样的设计，然而这两者在具体实现上其实有一些不同，其中前者使用通信顺序进程（Communication Sequential Process），而后者使用 Actor 模型进行设计；这两种不同的并发模型都是『使用通信来共享内存』的具体实现，它们的主要作用都是在不同的线程或者协程之间交换信息。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/b8c9b1b6-f2d4-413e-a647-2f5c412fa4f2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从本质上来看，计算机上线程和协程同步信息其实都是通过『共享内存』来进行的，因为无论是哪种通信模型，线程或者协程最终都会从内存中获取数据，所以更为准确的说法是『为什么我们使用发送消息的方式来同步信息，而不是多个线程或者协程直接共享内存？』&lt;/p&gt;
&lt;p&gt;为了理解今天的问题，我们需要了解这两种不同的信息同步机制的优点和缺点，对它们之间的优劣进行比较，这样我们才能充分理解 Go 语言和其他语言以及框架决策时背后的原因。&lt;/p&gt;
&lt;h3&gt;设计&lt;/h3&gt;
&lt;p&gt;这篇文章主要会从以下的几个方面介绍为什么我们应该选择使用通信的方式在多个线程或者协程之间保证信息的同步：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不同的同步机制具有不同的抽象层级；&lt;/li&gt;
&lt;li&gt;通过消息同步信息能够降低不同组件的耦合；&lt;/li&gt;
&lt;li&gt;使用消息来共享内存不会导致线程竞争的问题；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作者相信虽然这三个角度可能有一些重叠或者不够完善，但是也能够为我们提供足够的信息作出判断和选择，理解 Go 语言如何被这条设计哲学影响并将并发模型设计成现在的这种形式。&lt;/p&gt;
&lt;h4&gt;抽象层级&lt;/h4&gt;
&lt;p&gt;发送消息和共享内存这两种方式其实是用来传递信息的不同方式，但是它们两者有着不同的抽象层级，发送消息是一种相对『高级』的抽象，但是不同语言在实现这一机制时也都会使用操作系统提供的锁机制来实现，共享内存这种最原始和最本质的信息传递方式就是使用锁这种并发机制实现的。&lt;/p&gt;
&lt;p&gt;我们可以这么理解：更为高级和抽象的信息传递方式其实也只是对低抽象级别接口的组合和封装，Go 语言中的 &lt;a href=&quot;https://draveness.me/golang/concurrency/golang-channel.html&quot;&gt;Channel&lt;/a&gt; 就提供了 Goroutine 之间用于传递信息的方式，它在内部实现时就广泛用到了共享内存和锁，通过对两者进行的组合提供了更高级的同步机制。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/3692b194-03f9-459d-a41d-4e8f247777dd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;既然两种方式都能够帮助我们在不同的线程或者协程之间传递信息，那么我们应该尽量使用抽象层级更高的方法，因为这些方法往往提供了更良好的封装和与领域更相关和契合的设计；只有在高级抽象无法满足我们需求时才应该考虑抽象层级更低的方法，例如：当我们遇到对资源进行更细粒度的控制或者对性能有极高要求的场景。&lt;/p&gt;
&lt;h4&gt;耦合&lt;/h4&gt;
&lt;p&gt;使用发送消息的方式替代共享内存也能够帮助我们减少多个模块之间的耦合，假设我们使用共享内存的方式在多个 Goroutine 之间传递信息，每个 Goroutine 都可能是资源的生产者和消费者，它们需要在读取或者写入数据时先获取保护该资源的互斥锁。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/d7f98c9a-3e4a-46f5-a4f0-58ed6757db1e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然而我们使用发送消息的方式却可以将多个线程或者协程解耦，以前需要依赖同一个片内存的多个线程，现在可以成为消息的生产者和消费者，多个线程也不需要自己手动处理资源的获取和释放，其中 Go 语言实现的 CSP 机制通过引入 Channel 来解耦 Goroutine：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/14964f6c-62bb-4d7e-9ce9-096c50facb91.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;另一种使用消息发送的并发控制机制 &lt;a href=&quot;https://en.wikipedia.org/wiki/Actor_model&quot;&gt;Actor 模型&lt;/a&gt; 就省略了 Channel 这一概念，每一个 Actor 都在本地持有一个待处理信息的邮箱，多个 Actor 可以直接通过目标 Actor 的标识符发送信息，所有的信息都会在本地的信箱中等待当前 Actor 的处理。&lt;/p&gt;
&lt;p&gt;这种通过发送信息的解耦方式，尤其是 Go 语言实现的 CSP 模型其实与消息队列非常相似，我们引入 Channel 这一中间层让资源的生产者和消费者更加清晰，当我们需要增加新的生产者或者消费者时也只需要直接增加 Channel 的发送方和接收方。&lt;/p&gt;
&lt;h4&gt;线程竞争&lt;/h4&gt;
&lt;p&gt;在很多环境中，并发编程带来的很多问题都是因为没有正确实现访问共享编程的逻辑，而 Go 语言却鼓励我们将需要共享的变量传入 Channel 中，所有被共享的变量并不会同时被多个&lt;strong&gt;活跃的&lt;/strong&gt; Goroutine 访问，这种方式可以保证在同一时间只有一个 Goroutine 能够访问对应的值，所以数据冲突和线程竞争的问题在设计上就不可能出现。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do not communicate by sharing memory; instead, share memory by communicating.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;『不要通过共享内存来通信，我们应该通过通信来共享内存』，Go 语言鼓励我们使用这种方式设计能够处理高并发请求的程序。&lt;/p&gt;
&lt;p&gt;Go 语言在实现上通过 Channel 保证被共享的变量不会同时被多个活跃的 Goroutine 访问，一旦某个消息被发送到了 Channel 中，我们就失去了当前消息的控制权，作为接受者的 Goroutine 在收到这条消息之后就可以根据该消息进行一些计算任务；从这个过程来看，消息在被发送前只由发送方进行访问，在发送之后仅可被唯一的接受者访问，所以从这个设计上来看我们就避免了线程竞争。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/b415ddb1-b4f6-49e4-b6d3-ed3c863b28f7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;需要注意的是，如果我们向 Channel 中发送了一个指针而不是值的话，发送方在发送该条消息之后其实也&lt;strong&gt;保留了修改指针对应值的权利&lt;/strong&gt;，如果这时发送方和接收方都尝试修改指针对应的值，仍然会造成数据冲突的问题。&lt;/p&gt;
&lt;p&gt;对于在同一个机器和进程上运行的程序来说，由于内存对于当前进程都是可见的，所以我们没有办法避免这种问题的发生，只能说这并不是一种被鼓励的做法和常规的行为，当我们需要处理这种场景时使用更为底层的互斥锁才是一种正确的方式，然而在大多数时候这都意味着不正确的设计，我们需要重新思考线程之间的关系。&lt;/p&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;Go 语言并发模型的设计深受 CSP 模型的影响，我们简单总结一下为什么我们应该使用通信的方式来共享内存。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do not communicate by sharing memory; instead, share memory by communicating.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;首先，使用发送消息来同步信息相比于直接使用共享内存和互斥锁是一种更高级的抽象，使用更高级的抽象能够为我们在程序设计上提供更好的封装，让程序的逻辑更加清晰；&lt;/li&gt;
&lt;li&gt;其次，消息发送在解耦方面与共享内存相比也有一定优势，我们可以将线程的职责分成生产者和消费者，并通过消息传递的方式将它们解耦，不需要再依赖共享内存；&lt;/li&gt;
&lt;li&gt;最后，Go 语言选择消息发送的方式，通过保证同一时间只有一个活跃的线程能够访问数据，能够从设计上天然地避免线程竞争和数据冲突的问题；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;上面的这几点虽然不能完整地解释 Go 语言选择这种设计的方方面面，但是也给出了鼓励使用通信同步信息的充分原因，我们在设计和实现 Go 语言的程序中也应该学会这种思考方式，通过这种并发模型让我们的程序变得更容易理解。到了现在我们其实可以讨论一些更加开放的问题，各位读者可以想一想下面问题的答案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;除了使用发送消息和共享内存的方式，我们还可以选择哪些方式在不同的线程之间传递消息呢？&lt;/li&gt;
&lt;li&gt;共享内存和共享数据库作为同步信息的机制是不是有一些相似性，它们之间有什么异同呢？&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://draveness.me/whys-the-design-communication-shared-memory/&quot;&gt;为什么使用通信来共享内存 - 面向信仰编程 (draveness.me)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A8%E9%80%9A%E4%BF%A1%E6%9D%A5%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A8%E9%80%9A%E4%BF%A1%E6%9D%A5%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98.html</guid>
                                               <category>Program</category>
                                    </item>
                <item>
            <title>Spring Boot中使用RSocket</title>
            <description>
            &lt;!--
author: admin
date: 2022-10-17
title: Spring Boot中使用RSocket
tags: Spring,RSocket
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring Boot中使用RSocket&lt;/h1&gt;
&lt;h3&gt;概述&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;RSocket&lt;/code&gt;应用层协议支持 &lt;code&gt;Reactive Streams&lt;/code&gt;语义， 例如：用 RSocket 作为 HTTP 的一种替代方案。在本教程中， 我们将看到&lt;code&gt;RSocket&lt;/code&gt;用在 Spring Boot 中，特别是 Spring Boot 如何帮助抽象出更低级别的 RSocket API 。&lt;/p&gt;
&lt;h3&gt;依赖&lt;/h3&gt;
&lt;p&gt;让我们从添加&lt;code&gt;spring-boot-starter-rsocket&lt;/code&gt;依赖开始：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-rsocket&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个依赖会传递性的拉取&lt;code&gt;RSocket&lt;/code&gt;相关的依赖，比如：&lt;code&gt;rsocket-core&lt;/code&gt; 和 &lt;code&gt;rsocket-transport-netty&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;示例程序&lt;/h3&gt;
&lt;p&gt;现在继续我们的简单应用程序。为了突出&lt;code&gt;RSocket&lt;/code&gt;提供的交互模式，我打算创建一个交易应用程序， 交易应用程序包括客户端和服务器。&lt;/p&gt;
&lt;h4&gt;服务端设置&lt;/h4&gt;
&lt;p&gt;首先，我们设置由springboot应用程序引导的&lt;code&gt;RSocket server&lt;/code&gt;服务器。 因为有&lt;code&gt;spring-boot-starter-rsocket dependency&lt;/code&gt;依赖，所以 Spring Boot 会自动配置&lt;code&gt;RSocket server&lt;/code&gt;。
跟平常一样， 可以用属性驱动的方式修改&lt;code&gt;RSocket server&lt;/code&gt;默认配置值。例如：通过增加如下配置在&lt;code&gt;application.properties&lt;/code&gt;中，来修改&lt;code&gt;RSocket&lt;/code&gt;端口：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# RSocket Server Port
spring.rsocket.server.port=9999&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以根据需要进一步修改服务器的&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/2.2.0.M2/reference/html/appendix.html#rsocket-properties&quot;&gt;其他属性&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;客户端设置&lt;/h4&gt;
&lt;p&gt;接下来，我们来设置客户端，也是一个 Spring Boot 应用程序。虽然 Spring Boot 自动配置大部分 RSocket 相关的组件，但还要自定义一些对象来完成设置。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
public class ClientConfiguration {
    @Bean
    public RSocketRequester getRSocketRequester(){
        RSocketRequester.Builder builder = RSocketRequester.builder();

        return builder
                .rsocketConnector(
                        rSocketConnector -&amp;gt;
                                rSocketConnector.reconnect(Retry.fixedDelay(2, Duration.ofSeconds(2)))
                )
                .dataMimeType(MimeTypeUtils.APPLICATION_JSON)
                .rsocketStrategies(rsocketStrategies())
                .tcp(&quot;localhost&quot;, 9999);
    }

    @Bean
    public RSocketStrategies rsocketStrategies() {
        return RSocketStrategies.builder()
                .decoder(new Jackson2JsonDecoder())
                .encoder(new Jackson2JsonEncoder())
                // .dataBufferFactory(new DefaultDataBufferFactory(true))
                .build();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意这里的&lt;code&gt;rsocketStrategies&lt;/code&gt;不能省略，原文的 Github 源码省略这个属性导致我在尝试的时候总是提示 &lt;code&gt;No decoder for xxx&lt;/code&gt;，具体可见本文末尾给出的参考链接。&lt;/p&gt;
&lt;p&gt;我们正在创建&lt;code&gt;RSocket&lt;/code&gt;客户端并且配置TCP端口为：9999 。注意： 该服务端口我们在前面已经配置过。
接下来我们定义了一个RSocket的装饰器对象&lt;code&gt;RSocketRequester&lt;/code&gt;。 这个对象在我们跟&lt;code&gt;RSocket server&lt;/code&gt;交互时会为我们提供帮助。
定义这些对象配置后，我们还只是有了一个骨架。在接下来，我们将暴露不同的交互模式， 并看看 Spring Boot 在这个地方提供帮助的。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;Spring Boot RSocket&lt;/code&gt; 中的 &lt;code&gt;Request/Response&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;我们从&lt;code&gt;Request/Response&lt;/code&gt;开始，&lt;code&gt;HTTP&lt;/code&gt;也使用这种通信方式，这也是最常见的、最相似的交互模式。
在这种交互模式里， 由客户端初始化通信并发送一个请求。之后，服务器端执行操作并返回一个响应给客户端--这时通信完成。
在我们的交易应用程序里， 一个客户端询问一个给定的股票的当前的市场数据。 作为回复，服务器会传递请求的数据。&lt;/p&gt;
&lt;h4&gt;服务端&lt;/h4&gt;
&lt;p&gt;在服务器这边，我们首先应该创建一个&lt;code&gt;controller&lt;/code&gt; 来持有我们的处理器方法。 我们会使用 &lt;code&gt;@MessageMapping&lt;/code&gt;注解来代替像SpringMVC中的&lt;code&gt;@RequestMapping&lt;/code&gt;或者&lt;code&gt;@GetMapping&lt;/code&gt;注解：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Controller
public class MarketDataRSocketController {
    @Autowired
    private MarketDataRepository repository;

    @MessageMapping(&quot;currentMarketData&quot;)
    public Mono&amp;lt;MarketData&amp;gt; currentMarketData(MarketDataRequest request) {
        return repository.getOne(request.getStock());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;来研究下我们的控制器。 我们将使用&lt;code&gt;@Controller&lt;/code&gt;注解来定义一个控制器来处理进入 RSocket 的请求。 另外，注解&lt;code&gt;@MessageMapping&lt;/code&gt;让我们定义我们感兴趣的路由和如何响应一个请求。
在这个示例中， 服务器监听路由&lt;code&gt;currentMarketData&lt;/code&gt;， 并响应一个单一的结果&lt;code&gt;Mono&amp;lt;MarketData&amp;gt;&lt;/code&gt;给客户端。&lt;/p&gt;
&lt;h4&gt;客户端&lt;/h4&gt;
&lt;p&gt;接下来， 我们的 RSocket 客户端应该询问一只股票的价格并得到一个单一的响应。 为了初始化请求， 我们该使用&lt;code&gt;RSocketRequester&lt;/code&gt;类，如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RestController
public class MarketDataRestController {
    private final Random random = new Random();

    @Autowired
    private RSocketRequester rSocketRequester;

    @GetMapping(value = &quot;/current/{stock}&quot;)
    public Publisher&amp;lt;MarketData&amp;gt; current(@PathVariable(&quot;stock&quot;) String stock) {
        return rSocketRequester.route(&quot;currentMarketData&quot;)
                .data(new MarketDataRequest(stock))
                .retrieveMono(MarketData.class);
    }    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：在示例中，&lt;code&gt;RSocket&lt;/code&gt;客户端也是一个&lt;code&gt;REST&lt;/code&gt;风格的&lt;code&gt;controller&lt;/code&gt;，以此来访问我们的&lt;code&gt;RSocket&lt;/code&gt;服务器。因此，我们使用&lt;code&gt;@RestController&lt;/code&gt;和&lt;code&gt;@GetMapping&lt;/code&gt;注解来定义我们的请求/响应端点。
在端点方法中， 我们使用的是类&lt;code&gt;RSocketRequester&lt;/code&gt;并指定了路由。 事实上，这个是服务器端&lt;code&gt;RSocket&lt;/code&gt;所期望的路由，然后我们传递请求数据。最后，当调用&lt;code&gt;retrieveMono()&lt;/code&gt;方法时，Spring Boot 会帮我们初始化一个请求/响应交互。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;Spring Boot RSocket&lt;/code&gt;中的&lt;code&gt;Fire And Forget&lt;/code&gt;模式&lt;/h3&gt;
&lt;p&gt;接下来我们将查看 &lt;code&gt;Fire And Forget&lt;/code&gt;交互模式。正如名字提示的一样，客户端发送一个请求给服务器，但是不期望服务器的返回响应回来。 在我们的交易程序中， 一些客户端会作为数据资源服务，并且推送市场数据给服务器端。&lt;/p&gt;
&lt;h4&gt;服务端&lt;/h4&gt;
&lt;p&gt;我们来创建另外一个端点在我们的服务器应用程序中，如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@MessageMapping(&quot;collectMarketData&quot;)
public Mono&amp;lt;Void&amp;gt; collectMarketData(MarketData marketData) {
    repository.add(marketData);
    return Mono.empty();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们又一次定义了一个新的&lt;code&gt;@MessageMapping&lt;/code&gt;路由为&lt;code&gt;collectMarketData&lt;/code&gt;。此外， Spring Boot 自动转换传入的负载为一个&lt;code&gt;MarketData&lt;/code&gt;实例。
但是，这里最大的不同是我们返回一个&lt;code&gt;Mono&amp;lt;Void&amp;gt;&lt;/code&gt;，因为客户端不需要服务器的返回。&lt;/p&gt;
&lt;h4&gt;客户端&lt;/h4&gt;
&lt;p&gt;来看看我们如何初始化我们的&lt;code&gt;fire-and-forget&lt;/code&gt;模式的请求。 我们将创建另外一个REST风格的端点，如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@GetMapping(value = &quot;/collect&quot;)
public Publisher&amp;lt;Void&amp;gt; collect() {
    return rSocketRequester.route(&quot;collectMarketData&quot;)
            .data(getMarketData())
            .send();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里我们指定路由和负载将是一个&lt;code&gt;MarketData&lt;/code&gt;实例。 由于我们使用&lt;code&gt;send()&lt;/code&gt;方法来代替&lt;code&gt;retrieveMono()&lt;/code&gt;，所有交互模式变成了&lt;code&gt;fire-and-forget&lt;/code&gt;模式。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;Spring Boot RSocket&lt;/code&gt;中的&lt;code&gt;Request Stream&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;请求流是一种更复杂的交互模式， 这个模式中客户端发送一个请求，但是在一段时间内从服务器端获取到多个响应。 为了模拟这种交互模式， 客户端会询问给定股票的所有市场数据。&lt;/p&gt;
&lt;h4&gt;服务端&lt;/h4&gt;
&lt;p&gt;我们从服务器端开始。 我们将添加另外一个消息映射方法，如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@MessageMapping(&quot;feedMarketData&quot;)
public Flux&amp;lt;MarketData&amp;gt; feedMarketData(MarketDataRequest marketDataRequest) {
    return repository.getAll(marketDataRequest.getStock());
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正如所见， 这个处理器方法跟其他的处理器方法非常类似。 不同的部分是我们返回一个&lt;code&gt;Flux&amp;lt;MarketData&amp;gt;&lt;/code&gt;来代替&lt;code&gt;Mono&amp;lt;MarketData&amp;gt;&lt;/code&gt;。 最后我们的 RSocket 服务器会返回多个响应给客户端。&lt;/p&gt;
&lt;h4&gt;客户端&lt;/h4&gt;
&lt;p&gt;在客户端这边， 我们该创建一个端点来初始化请求/响应通信，如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@GetMapping(value = &quot;/feed/{stock}&quot;, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Publisher&amp;lt;MarketData&amp;gt; feed(@PathVariable(&quot;stock&quot;) String stock) {
    return rSocketRequester.route(&quot;feedMarketData&quot;)
            .data(new MarketDataRequest(stock))
            .retrieveFlux(MarketData.class);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们来研究下 RSocket 请求。 首先我们定义了路由和请求负载。 然后，我们定义了使用&lt;code&gt;retrieveFlux()&lt;/code&gt;调用的响应期望。这部分决定了交互模式。
另外注意：由于我们的客户端也是&lt;code&gt;REST&lt;/code&gt;风格的服务器，客户端也定义了响应媒介类型&lt;code&gt;MediaType.TEXT_EVENT_STREAM_VALUE&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;异常处理&lt;/h3&gt;
&lt;p&gt;现在让我们看看在服务器程序中，如何以声明式的方式处理异常。 当处理&lt;code&gt;请求/响应&lt;/code&gt;式， 我可以简单的使用&lt;code&gt;@MessageExceptionHandler&lt;/code&gt;注解，如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@MessageExceptionHandler
public Mono&amp;lt;MarketData&amp;gt; handleException(Exception e) {
    return Mono.just(MarketData.fromException(e));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里我们给异常处理方法标记注解为&lt;code&gt;@MessageExceptionHandler&lt;/code&gt;。作为结果， 这个方法将处理所有类型的异常， 因为&lt;code&gt;Exception&lt;/code&gt;是所有其他类型的异常的超类。
我们也可以明确地创建更多的不同类型的，不同的异常处理方法。 这当然是请求/响应模式，并且我们返回的是&lt;code&gt;Mono&amp;lt;MarketData&amp;gt;&lt;/code&gt;。我们期望这里的响应类型跟我们的交互模式的返回类型相匹配。&lt;/p&gt;
&lt;h3&gt;最后写点&lt;/h3&gt;
&lt;p&gt;客户端程序在 Windows 上运行处理请求时，会访问 hosts 文件，需要修改 hosts 文件给与读取权限，否则会抛出异常。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://juejin.cn/post/6844903860192935949&quot;&gt;Spring Boot中使用RSocket - 掘金 (juejin.cn)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/spring-boot-rsocket&quot;&gt;RSocket Using Spring Boot | Baeldung&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/issues/18703&quot;&gt;springboot rsocket 2.2.0.RELEASE bug · Issue #18703 · spring-projects/spring-boot (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-framework/issues/28462&quot;&gt;Spring rsocket not works properly in request Channel mode after version 2.5 of the spring framework · Issue #28462 · spring-projects/spring-framework (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kasra-haghpanah/election-spring-rsocket-with-rsocket-js/blob/master/src/main/java/com/council/election/configuration/rsocket/RSocketConfig.java&quot;&gt;election-spring-rsocket-with-rsocket-js/RSocketConfig.java at master · kasra-haghpanah/election-spring-rsocket-with-rsocket-js (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/han1448/spring-rsocket-example&quot;&gt;han1448/spring-rsocket-example (github.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringBoot%E4%B8%AD%E4%BD%BF%E7%94%A8RSocket.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringBoot%E4%B8%AD%E4%BD%BF%E7%94%A8RSocket.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Java开发利器之重试框架guava-retrying</title>
            <description>
            &lt;!--
author: admin
date: 2022-10-14
title: Java开发利器之重试框架guava-retrying
tags: 重试
category: java
status: publish
summary: 重要的事情试三遍~
--&gt;
&lt;h1&gt;Java开发利器之重试框架guava-retrying&lt;/h1&gt;
&lt;h3&gt;前言&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;guava-retrying是谷歌的Guava库的一个小扩展，允许为任意函数调用创建可配置的重试策略，比如与正常运行时间不稳定的远程服务对话的函数调用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Github 地址：&lt;a href=&quot;https://github.com/rholder/guava-retrying&quot;&gt;GitHub - rholder/guava-retrying: This is a small extension to Google&#039;s Guava library to allow for the creation of configurable retrying strategies for an arbitrary function call, such as something that talks to a remote service with flaky uptime.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在日常开发中，尤其是在微服务盛行的时代下，我们在调用外部接口时，经常会因为第三方接口超时、限流等问题从而造成接口调用失败，那么此时我们通常会对接口进行重试，那么问题来了，如何重试呢？该重试几次呢？如果要设置重试时间超过多长时间后还不成功就不重试了该怎么做呢？所幸 guava-retrying 为我们提供了强大而简单易用的重试框架 guava-retrying 。&lt;/p&gt;
&lt;h3&gt;pom 依赖&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;com.github.rholder&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;guava-retrying&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;2.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;示例&lt;/h3&gt;
&lt;p&gt;我们可以通过 &lt;strong&gt;RetryerBuilder&lt;/strong&gt; 来构造一个重试器，通过 &lt;strong&gt;RetryerBuilder&lt;/strong&gt; 可以设置什么时候需要重试（即重试时机）、停止重试策略、失败等待时间间隔策略、任务执行时长限制策略&lt;/p&gt;
&lt;p&gt;先看一个简单的例子：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class RetryTest {

    private int invokeCount = 0;

    public int realAction(int num) {
        invokeCount++;
        System.out.printf(&quot;当前执行第 %d 次，num: %d%n&quot;, invokeCount, num);
        if(num &amp;lt; 0) {
            throw new IllegalArgumentException();
        }
        return num;
    }

    @Test
    public void guavaRetryTest001() {
        Retryer&amp;lt;Integer&amp;gt; retryer = RetryerBuilder.&amp;lt;Integer&amp;gt;newBuilder()
                // 非正数进行重试
                .retryIfRuntimeException()
                // 偶数则进行重试
                .retryIfResult(result -&amp;gt; result % 2 == 0)
                // 设置最大执行次数 3 次
                .withStopStrategy(StopStrategies.stopAfterAttempt(3)).build();

        try {
            invokeCount = 0;
            retryer.call(() -&amp;gt; realAction(0));
        } catch (Exception e) {
            System.out.println(&quot;执行0，异常：&quot; + e.getMessage());
        }

        try {
            invokeCount=0;
            retryer.call(() -&amp;gt; realAction(1));
        } catch (Exception e) {
            System.out.println(&quot;执行1，异常：&quot; + e.getMessage());
        }

        try {
            invokeCount=0;
            retryer.call(() -&amp;gt; realAction(2));
        } catch (Exception e) {
            System.out.println(&quot;执行2，异常：&quot; + e.getMessage());
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;输出&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;index_files/71dea4c0-db9a-4d98-884a-9dbc913f883f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;重试时机&lt;/h3&gt;
&lt;p&gt;RetryerBuilder 的&lt;code&gt;retryIfXXX()&lt;/code&gt;方法用来设置在什么情况下进行重试，总体上可以分为根据执行异常进行重试和根据方法执行结果进行重试两类。&lt;/p&gt;
&lt;h4&gt;根据异常进行重试&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;retryIfException()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当方法执行抛出异常 &lt;code&gt;isAssignableFrom Exception.class&lt;/code&gt; 时重试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;retryIfRuntimeException()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当方法执行抛出异常 &lt;code&gt;isAssignableFrom RuntimeException.class&lt;/code&gt; 时重试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;retryIfException(Predicate exceptionPredicate)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;这里当发生异常时，会将异常传递给&lt;code&gt;exceptionPredicate&lt;/code&gt;，那我们就可以通过传入的异常进行更加自定义的方式来决定什么时候进行重试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;retryIfExceptionOfType(Class&amp;lt;? extends Throwable&amp;gt; exceptionClass)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当方法执行抛出异常 &lt;code&gt;isAssignableFrom&lt;/code&gt; 传入的&lt;code&gt;exceptionClass&lt;/code&gt; 时重试&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;根据返回结果进行重试&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;retryIfResult(@Nonnull Predicate resultPredicate)&lt;/code&gt;这个比较简单，当我们传入的&lt;code&gt;resultPredicate&lt;/code&gt;返回&lt;code&gt;true&lt;/code&gt;时则进行重试。&lt;/p&gt;
&lt;h3&gt;停止重试策略StopStrategy&lt;/h3&gt;
&lt;p&gt;停止重试策略用来决定什么时候不进行重试，其接口&lt;code&gt;com.github.rholder.retry.StopStrategy&lt;/code&gt;，停止重试策略的实现类均在&lt;code&gt;com.github.rholder.retry.StopStrategies&lt;/code&gt;中，它是一个策略工厂类。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public interface StopStrategy {

    /**
     * Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the retryer should stop retrying.
     *
     * @param failedAttempt the previous failed {@code Attempt}
     * @return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the retryer must stop, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise
     */
    boolean shouldStop(Attempt failedAttempt);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;NeverStopStrategy&lt;/h4&gt;
&lt;p&gt;此策略将永远重试，永不停止，查看其实现类，直接返回了&lt;code&gt;false&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Override
public boolean shouldStop(Attempt failedAttempt) {
    return false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;StopAfterAttemptStrategy&lt;/h4&gt;
&lt;p&gt;当执行次数到达指定次数之后停止重试，查看其实现类：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private static final class StopAfterAttemptStrategy implements StopStrategy {
    private final int maxAttemptNumber;

    public StopAfterAttemptStrategy(int maxAttemptNumber) {
        Preconditions.checkArgument(maxAttemptNumber &amp;gt;= 1, &quot;maxAttemptNumber must be &amp;gt;= 1 but is %d&quot;, maxAttemptNumber);
        this.maxAttemptNumber = maxAttemptNumber;
    }

    @Override
    public boolean shouldStop(Attempt failedAttempt) {
        return failedAttempt.getAttemptNumber() &amp;gt;= maxAttemptNumber;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;StopAfterDelayStrategy&lt;/h4&gt;
&lt;p&gt;当距离方法的第一次执行超出了指定的 delay 时间时停止，也就是说一直进行重试，当进行下一次重试的时候会判断从第一次执行到现在的所消耗的时间是否超过了这里指定的 delay 时间，查看其实现：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private static final class StopAfterAttemptStrategy implements StopStrategy {
    private final int maxAttemptNumber;

    public StopAfterAttemptStrategy(int maxAttemptNumber) {
        Preconditions.checkArgument(maxAttemptNumber &amp;gt;= 1, &quot;maxAttemptNumber must be &amp;gt;= 1 but is %d&quot;, maxAttemptNumber);
        this.maxAttemptNumber = maxAttemptNumber;
    }

    @Override
    public boolean shouldStop(Attempt failedAttempt) {
        return failedAttempt.getAttemptNumber() &amp;gt;= maxAttemptNumber;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;重试间隔策略 WaitStrategy 以及重试阻塞策略BlockStrategy&lt;/h3&gt;
&lt;p&gt;这两个策略放在一起说，它们合起来的作用就是用来控制重试任务之间的间隔时间，以及如何任务在等待时间间隔时如何阻塞。也就是说 WaitStrategy 决定了重试任务等待多久后进行下一次任务的执行， BlockStrategy 用来决定任务如何等待。它们两的策略工厂分别为 com.github.rholder.retry.WaitStrategies 和 BlockStrategies 。&lt;/p&gt;
&lt;h4&gt;BlockStrategy&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;ThreadSleepStrategy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个是 BlockStrategies，决定如何阻塞任务，其主要就是通过 &lt;strong&gt;Thread.sleep()&lt;/strong&gt; 来进行阻塞的，查看其实现：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Immutable
private static class ThreadSleepStrategy implements BlockStrategy {

    @Override
    public void block(long sleepTime) throws InterruptedException {
        Thread.sleep(sleepTime);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;WaitStrategy&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;IncrementingWaitStrategy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;该策略在决定任务间隔时间时，返回的是一个递增的间隔时间，即每次任务重试间隔时间逐步递增，越来越长，查看其实现：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private static final class IncrementingWaitStrategy implements WaitStrategy {
    private final long initialSleepTime;
    private final long increment;

    public IncrementingWaitStrategy(long initialSleepTime,
                                    long increment) {
        Preconditions.checkArgument(initialSleepTime &amp;gt;= 0L, &quot;initialSleepTime must be &amp;gt;= 0 but is %d&quot;, initialSleepTime);
        this.initialSleepTime = initialSleepTime;
        this.increment = increment;
    }

    @Override
    public long computeSleepTime(Attempt failedAttempt) {
        long result = initialSleepTime + (increment * (failedAttempt.getAttemptNumber() - 1));
        return result &amp;gt;= 0L ? result : 0L;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该策略输入一个起始间隔时间值和一个递增步长，然后每次等待的时长都递增increment 时长。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RandomWaitStrategy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;顾名思义，返回一个随机的间隔时长，我们需要传入的就是一个最小间隔和最大间隔，然后随机返回介于两者之间的一个间隔时长，其实现为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private static final class RandomWaitStrategy implements WaitStrategy {
    private static final Random RANDOM = new Random();
    private final long minimum;
    private final long maximum;

    public RandomWaitStrategy(long minimum, long maximum) {
        Preconditions.checkArgument(minimum &amp;gt;= 0, &quot;minimum must be &amp;gt;= 0 but is %d&quot;, minimum);
        Preconditions.checkArgument(maximum &amp;gt; minimum, &quot;maximum must be &amp;gt; minimum but maximum is %d and minimum is&quot;, maximum, minimum);

        this.minimum = minimum;
        this.maximum = maximum;
    }

    @Override
    public long computeSleepTime(Attempt failedAttempt) {
        long t = Math.abs(RANDOM.nextLong()) % (maximum - minimum);
        return t + minimum;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;FixedWaitStrategy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;该策略是返回一个固定时长的重试间隔。查看其实现：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private static final class FixedWaitStrategy implements WaitStrategy {
    private final long sleepTime;

    public FixedWaitStrategy(long sleepTime) {
        Preconditions.checkArgument(sleepTime &amp;gt;= 0L, &quot;sleepTime must be &amp;gt;= 0 but is %d&quot;, sleepTime);
        this.sleepTime = sleepTime;
    }

    @Override
    public long computeSleepTime(Attempt failedAttempt) {
        return sleepTime;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ExceptionWaitStrategy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;该策略是由方法执行异常来决定是否重试任务之间进行间隔等待，以及间隔多久。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private static final class ExceptionWaitStrategy&amp;lt;T extends Throwable&amp;gt; implements WaitStrategy {
    private final Class&amp;lt;T&amp;gt; exceptionClass;
    private final Function&amp;lt;T, Long&amp;gt; function;

    public ExceptionWaitStrategy(@Nonnull Class&amp;lt;T&amp;gt; exceptionClass, @Nonnull Function&amp;lt;T, Long&amp;gt; function) {
        this.exceptionClass = exceptionClass;
        this.function = function;
    }

    @SuppressWarnings({&quot;ThrowableResultOfMethodCallIgnored&quot;, &quot;ConstantConditions&quot;, &quot;unchecked&quot;})
    @Override
    public long computeSleepTime(Attempt lastAttempt) {
        if (lastAttempt.hasException()) {
            Throwable cause = lastAttempt.getExceptionCause();
            if (exceptionClass.isAssignableFrom(cause.getClass())) {
                return function.apply((T) cause);
            }
        }
        return 0L;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CompositeWaitStrategy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个没啥好说的，顾名思义，就是一个策略的组合，你可以传入多个 WaitStrategy，然后所有 WaitStrategy 返回的间隔时长相加就是最终的间隔时间。查看其实现：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private static final class CompositeWaitStrategy implements WaitStrategy {
    private final List&amp;lt;WaitStrategy&amp;gt; waitStrategies;

    public CompositeWaitStrategy(List&amp;lt;WaitStrategy&amp;gt; waitStrategies) {
        Preconditions.checkState(!waitStrategies.isEmpty(), &quot;Need at least one wait strategy&quot;);
        this.waitStrategies = waitStrategies;
    }

    @Override
    public long computeSleepTime(Attempt failedAttempt) {
        long waitTime = 0L;
        for (WaitStrategy waitStrategy : waitStrategies) {
            waitTime += waitStrategy.computeSleepTime(failedAttempt);
        }
        return waitTime;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;FibonacciWaitStrategy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个策略与 IncrementingWaitStrategy 有点相似，间隔时间都是随着重试次数的增加而递增的，不同的是，FibonacciWaitStrategy 是按照斐波那契数列来进行计算的，使用这个策略时，我们需要传入一个乘数因子和最大间隔时长，其实现就不贴了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ExponentialWaitStrategy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个与 IncrementingWaitStrategy 、FibonacciWaitStrategy 也类似，间隔时间都是随着重试次数的增加而递增的，但是该策略的递增是呈指数级递增。查看其实现：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private static final class ExponentialWaitStrategy implements WaitStrategy {
    private final long multiplier;
    private final long maximumWait;

    public ExponentialWaitStrategy(long multiplier,
                                   long maximumWait) {
        Preconditions.checkArgument(multiplier &amp;gt; 0L, &quot;multiplier must be &amp;gt; 0 but is %d&quot;, multiplier);
        Preconditions.checkArgument(maximumWait &amp;gt;= 0L, &quot;maximumWait must be &amp;gt;= 0 but is %d&quot;, maximumWait);
        Preconditions.checkArgument(multiplier &amp;lt; maximumWait, &quot;multiplier must be &amp;lt; maximumWait but is %d&quot;, multiplier);
        this.multiplier = multiplier;
        this.maximumWait = maximumWait;
    }

    @Override
    public long computeSleepTime(Attempt failedAttempt) {
        double exp = Math.pow(2, failedAttempt.getAttemptNumber());
        long result = Math.round(multiplier * exp);
        if (result &amp;gt; maximumWait) {
            result = maximumWait;
        }
        return result &amp;gt;= 0L ? result : 0L;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;重试监听器RetryListener&lt;/h3&gt;
&lt;p&gt;当发生重试时，将会调用 RetryListener 的 onRetry 方法，此时我们可以进行比如记录日志等额外操作。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public int realAction(int num) {
    if (num &amp;lt;= 0) {
        throw new IllegalArgumentException();
    }
    return num;
}

@Test
public void guavaRetryTest001() throws ExecutionException, RetryException {
    Retryer&amp;lt;Integer&amp;gt; retryer = RetryerBuilder.&amp;lt;Integer&amp;gt;newBuilder().retryIfException()
        .withRetryListener(new MyRetryListener())
        // 设置最大执行次数3次
        .withStopStrategy(StopStrategies.stopAfterAttempt(3)).build();
    retryer.call(() -&amp;gt; realAction(0));

}

private static class MyRetryListener implements RetryListener {

    @Override
    public &amp;lt;V&amp;gt; void onRetry(Attempt&amp;lt;V&amp;gt; attempt) {
        System.out.println(&quot;第&quot; + attempt.getAttemptNumber() + &quot;次执行&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;输出&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;第1次执行
第2次执行
第3次执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;重试原理&lt;/h3&gt;
&lt;p&gt;其实到这一步之后，实现原理大概就很清楚了，就是由上述各种策略配合从而达到了非常灵活的重试机制。在这之前我们看一个上面没说的东东&lt;code&gt;Attempt&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public interface Attempt&amp;lt;V&amp;gt; {
    public V get() throws ExecutionException;

    public boolean hasResult();

    public boolean hasException();

    public V getResult() throws IllegalStateException;

    public Throwable getExceptionCause() throws IllegalStateException;

    public long getAttemptNumber();

    public long getDelaySinceFirstAttempt();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过接口方法可以知道&lt;code&gt;Attempt&lt;/code&gt;这个类包含了任务执行次数、任务执行异常、任务执行结果、以及首次执行任务至今的时间间隔，那么我们后续的不管重试时机、还是其他策略都是根据此值来决定。&lt;/p&gt;
&lt;p&gt;接下来看关键执行入口&lt;code&gt;Retryer#call&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public V call(Callable&amp;lt;V&amp;gt; callable) throws ExecutionException, RetryException {
    long startTime = System.nanoTime();

    // 执行次数从1开始
    for (int attemptNumber = 1; ; attemptNumber++) {
        Attempt&amp;lt;V&amp;gt; attempt;
        try {
            // 尝试执行
            V result = attemptTimeLimiter.call(callable);

            // 执行成功则将结果封装为ResultAttempt
            attempt = new Retryer.ResultAttempt&amp;lt;V&amp;gt;(result, attemptNumber, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime));
        } catch (Throwable t) {
            // 执行异常则将结果封装为ExceptionAttempt
            attempt = new Retryer.ExceptionAttempt&amp;lt;V&amp;gt;(t, attemptNumber, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime));
        }

        // 这里将执行结果传给RetryListener做一些额外事情
        for (RetryListener listener : listeners) {
            listener.onRetry(attempt);
        }

        // 这个就是决定是否要进行重试的地方，如果不进行重试直接返回结果，执行成功就返回结果，执行失败就返回异常
        if (!rejectionPredicate.apply(attempt)) {
            return attempt.get();
        }

        // 到这里，说明需要进行重试，则此时先决定是否到达了停止重试的时机，如果到达了则直接返回异常
        if (stopStrategy.shouldStop(attempt)) {
            throw new RetryException(attemptNumber, attempt);
        } else {
            // 决定重试时间间隔
            long sleepTime = waitStrategy.computeSleepTime(attempt);
            try {
                // 进行阻塞
                blockStrategy.block(sleepTime);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RetryException(attemptNumber, attempt);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;通篇下来可以看到其实核心实现并不难，但是此框架通过建造者模式和策略模式组合运用，提供了十分清晰明了且灵活的重试机制，其设计思路还是值得借鉴学习！&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://juejin.cn/post/7014099031718641694&quot;&gt;Java开发利器之重试框架guava-retrying - 掘金 (juejin.cn)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Java%E5%BC%80%E5%8F%91%E5%88%A9%E5%99%A8%E4%B9%8B%E9%87%8D%E8%AF%95%E6%A1%86%E6%9E%B6guava-retrying.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Java%E5%BC%80%E5%8F%91%E5%88%A9%E5%99%A8%E4%B9%8B%E9%87%8D%E8%AF%95%E6%A1%86%E6%9E%B6guava-retrying.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>异步任务调度工具CompleteFeature</title>
            <description>
            &lt;!--
author: admin
date: 2022-10-13
title: 异步任务调度工具CompleteFeature
tags: 多线程,并发
category: java
status: publish
summary: 这个 Java 并发可真难学~
--&gt;
&lt;h1&gt;异步任务调度工具CompleteFeature&lt;/h1&gt;
&lt;h3&gt;&lt;strong&gt;CompleteFeature简介&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;CompleteFeature是对Feature的增强，Feature只能处理简单的异步任务，而CompleteFeature可以将多个异步任务进行复杂的组合，支持串行执行，并行执行，And汇聚，Or汇聚，从而能对复杂的关联任务进行调度。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;CompleteFeature支持的业务场景&lt;/strong&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;串行任务&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;串行任务指任务B要等待任务A执行完成之后才会执行，串行任务有如下属性：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;可获取 A 的结果&lt;/td&gt;
&lt;td&gt;任务 B 可获取任务 A 的执行结果作为参数使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B 有返回值&lt;/td&gt;
&lt;td&gt;如果任务 B 有返回值，可以将执行结果通过返回值返回&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可获取 A 异常&lt;/td&gt;
&lt;td&gt;任务 B 可以获取任务 A 抛出的异常&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A 异常则终止&lt;/td&gt;
&lt;td&gt;当任务 A 抛出异常后，程序是否会终止，若会终止，程序将退出，任务 B 不会执行，否则程序不会退出，继续执行&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;CompleteFeature支持的串行任务方法如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;可获取 A 的结果&lt;/th&gt;
&lt;th&gt;B 有返回值&lt;/th&gt;
&lt;th&gt;可获取 A 异常&lt;/th&gt;
&lt;th&gt;A 异常则终止&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenRun&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenApply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenAccept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenCompose&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;whenComplete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exceptionally&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;handle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;任务不会抛出异常就使用前四个方法，否则使用后三个方法。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exceptionally&lt;/code&gt;相当于&lt;code&gt;try {} catch {}&lt;/code&gt;的&lt;code&gt;catch&lt;/code&gt;部分，&lt;code&gt;whenComplete&lt;/code&gt;和&lt;code&gt;handle&lt;/code&gt;相当于&lt;code&gt;try {} catch {} finally {}&lt;/code&gt; 的&lt;code&gt;catch&lt;/code&gt;和&lt;code&gt;finall&lt;/code&gt;部分，区别是一个有返回值，一个没有返回值。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;thenApply&lt;/code&gt;和&lt;code&gt;thenCompose&lt;/code&gt;的区别是，&lt;code&gt;thenCompose&lt;/code&gt;在任务 B 中返回的是&lt;code&gt;CompletableFuture&lt;/code&gt;，可参考后面的例子对比差异。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h4&gt;&lt;strong&gt;And汇聚关系&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;And汇聚关系是指：任务 C 要等待任务 A 和任务 B 都执行完后才执行。CompleteFeature 支持此关系的方法如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;C 接收 A 和 B 返回值作为参数&lt;/th&gt;
&lt;th&gt;C 有返回值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenCombine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenAcceptBoth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;runAfterBoth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;&lt;strong&gt;Or汇聚关系&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Or 汇聚关系是指：任务 C 等待任务 A 或任务 B 其中一个执行完后就执行，即 C 只需等待最先执行完成的任务后就可执行。CompleteFeature 支持此关系的方法如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;C 接收 A 或 B 返回值作为参数&lt;/th&gt;
&lt;th&gt;C 有返回值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;applyToEither&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;acceptEither&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;runAfterEither&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;&lt;strong&gt;多任务&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;CompletableFuture 提供了两个多任务的方法：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;anyOf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;多个任务中的任意一个任务执行完则结束，可以获取到最先执行完的任务的返回值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;allOf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;多个任务都执行完后才结束，不能获取到任何一个任务的返回值&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;以上所有方法的返回值都是 CompletableFuture ，这样就可以继续调用前面描述的方法来进行任务组合，组合出更加复杂的任务处理流程。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;方法族&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;以上方法中的最后一个任务都是和前面的任务在一个线程内执行，CompletableFuture中 还有一套方法让最后一个任务在新线程中执行，只要在原方法上加上 Async 后缀则可，例如：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;同步&lt;/th&gt;
&lt;th&gt;异步&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenApply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;thenApplyAsync&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenAccept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;thenAcceptAsync&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenRun&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;thenRunAsync&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenCompose&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;thenComposeAsync&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://juejin.cn/post/6844904130570371079&quot;&gt;Java并发编程入门（十九）异步任务调度工具CompleteFeature - 掘金 (juejin.cn)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E5%B7%A5%E5%85%B7CompleteFeature.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E5%B7%A5%E5%85%B7CompleteFeature.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>JAVA 泛型中的通配符 T，E，K，V，?</title>
            <description>
            &lt;!--
author: admin
date: 2022-10-10
title: JAVA 泛型中的通配符 T，E，K，V，?
tags: 泛型,generics
category: java
status: publish
summary: 终于有点明白为什么泛型极大的提高了集合的生产力
--&gt;
&lt;h1&gt;JAVA 泛型中的通配符 T，E，K，V，?&lt;/h1&gt;
&lt;h3&gt;前言&lt;/h3&gt;
&lt;p&gt;Java 泛型（generics）是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制，该机制允许开发者在编译时检测到非法的类型。&lt;/p&gt;
&lt;p&gt;泛型的本质是参数化类型，也就是说所操作的数据类型被指定为一个参数。&lt;/p&gt;
&lt;h3&gt;泛型带来的好处&lt;/h3&gt;
&lt;p&gt;在没有泛型的情况的下，通过对类型 Object 的引用来实现参数的“任意化”，“任意化”带来的缺点是要做显式的强制类型转换，而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况，编译器可能不提示错误，在运行的时候才出现异常，这是本身就是一个安全隐患。&lt;/p&gt;
&lt;p&gt;那么泛型的好处就是在编译的时候能够检查类型安全，并且所有的强制转换都是自动和隐式的。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class GlmapperGeneric&amp;lt;T&amp;gt;{
    private T t;
    private void set(T t) {this.t = t;}
    private T get() {return t;}

    public static void main(String[] args) {
        //TODO
    }

    /**
     * 不指定类型
     */
    public void noSpecifyType() {
        GlmapperGeneric glmapperGeneric = new GlmapperGeneric();
        glmapperGeneric.set(&quot;test&quot;);
        // 需要强制类型转换
        String test = (String) glmapperGeneric.get();
        System.out.println(test);
    }

    /**
     * 指定类型
     */
    public void specifyType() {
        GlmapperGeneric&amp;lt;String&amp;gt; glmapperGeneric = new GlmapperGeneric();
        glmapperGeneric.set(&quot;test&quot;);
        // 不需要强制类型转换
        String test = glmapperGeneric.get();
        System.out.println(test);

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面这段代码中的 specifyType 方法中 省去了强制转换，可以在编译时候检查类型安全，可以用在类，方法，接口上。&lt;/p&gt;
&lt;h3&gt;泛型中的通配符&lt;/h3&gt;
&lt;p&gt;我们在定义泛型类，泛型方法，泛型接口的时候经常会碰见很多不同的通配符，比如 T，E，K，V 等等，这些通配符又都是什么意思呢？&lt;/p&gt;
&lt;h4&gt;常用的 T，E，K，V，？&lt;/h4&gt;
&lt;p&gt;本质上这些个都是通配符，没啥区别，只不过是编码时的一种约定俗成的东西。比如上述代码中的 T ，我们可以换成 A-Z 之间的任何一个 字母都可以，并不会影响程序的正常运行，但是如果换成其他的字母代替 T ，在可读性上可能会弱一些。&lt;strong&gt;通常情况下，T，E，K，V，？ 是这样约定的：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;？ 表示不确定的 java 类型&lt;/li&gt;
&lt;li&gt;T (type) 表示具体的一个 java 类型&lt;/li&gt;
&lt;li&gt;K V (key value) 分别代表 java 键值中的 Key Value&lt;/li&gt;
&lt;li&gt;E (element) 代表 Element，在集合中使用，因为集合中存放的是元素&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;？ &lt;strong&gt;无界通配符&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;先从一个小例子看起。&lt;/p&gt;
&lt;p&gt;我有一个父类 Animal 和几个子类，如狗、猫等，现在我需要一个动物的列表，我的第一个想法是像这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;List&amp;lt;Animal&amp;gt; listAnimals&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是老板的想法确实这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;List&amp;lt;? extends Animal&amp;gt; listAnimals&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为什么要使用通配符而不是简单的泛型呢？通配符其实在声明局部变量时是没有什么意义的，但是当你为一个方法声明一个参数时，它是非常重要的。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;static int countLegs (List&amp;lt;? extends Animal &amp;gt; animals ) {
    int retVal = 0;
    for ( Animal animal : animals )
    {
        retVal += animal.countLegs();
    }
    return retVal;
}

static int countLegs1 (List&amp;lt; Animal &amp;gt; animals ){
    int retVal = 0;
    for ( Animal animal : animals )
    {
        retVal += animal.countLegs();
    }
    return retVal;
}

public static void main(String[] args) {
    List&amp;lt;Dog&amp;gt; dogs = new ArrayList&amp;lt;&amp;gt;();
    // 不会报错
    countLegs( dogs );
    // 报错
    countLegs1(dogs);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当调用 countLegs1 时，就会飘红，&lt;img src=&quot;index_files/88745497-f4f0-47d6-95f3-89cf63aeafee.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;需要改成&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;List&amp;lt;Animal&amp;gt; dogs = new ArrayList&amp;lt;&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以，对于不确定或者不关心实际要操作的类型，可以使用无限制通配符（尖括号里一个问号，即 &amp;lt;?&amp;gt; ），表示可以持有任何类型。像 countLegs 方法中，限定了上届，但是不关心具体类型是什么，所以对于传入的 Animal 的所有子类都可以支持，并且不会报错。而 countLegs1 就不行。&lt;/p&gt;
&lt;h4&gt;上界通配符 &amp;lt; ? extends E&amp;gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;上界：用 extends 关键字声明，表示参数化的类型可能是所指定的类型，或者是此类型的子类。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在类型参数中使用 extends 表示这个泛型中的参数必须是 E 或者 E 的子类，这样有两个好处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果传入的类型不是 E 或者 E 的子类，编译不成功&lt;/li&gt;
&lt;li&gt;泛型中可以使用 E 的方法，要不然还得强转成 E 才能使用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private &amp;lt;K extends A, E extends B&amp;gt; E test(K arg1, E arg2){
    E result = arg2;
    arg2.compareTo(arg1);
    //.....
    return result;
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;类型参数列表中如果有多个类型参数上限，用逗号分开&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;下界通配符 &amp;lt; ? super E&amp;gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;下界: 用 super 进行声明，表示参数化的类型可能是所指定的类型，或者是此类型的父类型，直至 Object&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在类型参数中使用 super 表示这个泛型中的参数必须是 E 或者 E 的父类。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class App 
{
    private &amp;lt;T&amp;gt; void test(List&amp;lt;? super T&amp;gt; dst, List&amp;lt;T&amp;gt; src){
        for (T t : src) {
            dst.add(t);
        }
    }

    public static void main( String[] args )
    {
        List&amp;lt;Dog&amp;gt; dogs = new ArrayList&amp;lt;&amp;gt;();
        List&amp;lt;Animal&amp;gt; animals = new ArrayList&amp;lt;&amp;gt;();
        new App().test(animals,dogs);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dst 类型 “大于等于” src 的类型，这里的“大于等于”是指 dst 表示的范围比 src 要大，因此装得下 dst 的容器也就能装 src 。&lt;/p&gt;
&lt;h4&gt;？ 和 T 的区别&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;index_files/ddfc6a45-a7ec-461e-99e2-2ffce9408df5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;？和 T 都表示不确定的类型，区别在于我们可以对 T 进行操作，但是对 ？ 不行，比如如下这种 ：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 可以
T t = operate();

// 不可以
？ car = operate();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;简单总结下：&lt;/p&gt;
&lt;p&gt;T 是一个 确定的 类型，通常用于泛型类和泛型方法的定义，？是一个 不确定 的类型，通常用于泛型方法的调用代码和形参，不能用于定义类和泛型方法。&lt;/p&gt;
&lt;h4&gt;区别1：通过 T 来确保泛型参数的一致性&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 通过 T 来 确保 泛型参数的一致性
public &amp;lt;T extends Number&amp;gt; void
test(List&amp;lt;T&amp;gt; dest, List&amp;lt;T&amp;gt; src)

//通配符是 不确定的，所以这个方法不能保证两个 List 具有相同的元素类型
public void
test(List&amp;lt;? extends Number&amp;gt; dest, List&amp;lt;? extends Number&amp;gt; src)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;像下面的代码中，约定的 T 是 Number 的子类才可以，但是申明时是用的 String ，所以就会飘红报错。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/d65b9b1c-bc03-4efb-b74a-4571520506ff.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不能保证两个 List 具有相同的元素类型的情况：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;GlmapperGeneric&amp;lt;String&amp;gt; glmapperGeneric = new GlmapperGeneric&amp;lt;&amp;gt;();
List&amp;lt;String&amp;gt; dest = new ArrayList&amp;lt;&amp;gt;();
List&amp;lt;Number&amp;gt; src = new ArrayList&amp;lt;&amp;gt;();
glmapperGeneric.testNon(dest,src);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的代码在编译器并不会报错，但是当进入到 testNon 方法内部操作时（比如赋值），对于 dest 和 src 而言，就还是需要进行类型转换。&lt;/p&gt;
&lt;h4&gt;区别2：类型参数可以多重限定而通配符不行&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class Multilimit implements MultilimitInterfaceA, MultilimitInterfaceB {
    public static &amp;lt;T extends MultilimitInterfaceA &amp;amp; MultilimitInterfaceB&amp;gt; void test(T t) {}
}

interface MultilimitInterfaceA {}
interface MultilimitInterfaceB {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 &amp;amp; 符号设定多重边界（Multi Bounds)，指定泛型类型 T 必须是 MultiLimitInterfaceA 和 MultiLimitInterfaceB 的共有子类型，此时变量 t 就具有了所有限定的方法和属性。对于通配符来说，因为它不是一个确定的类型，所以不能进行多重限定。&lt;/p&gt;
&lt;h4&gt;区别3：通配符可以使用超类限定而类型参数不行&lt;/h4&gt;
&lt;p&gt;类型参数 T 只具有 一种 类型限定方式：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;T extends A&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是通配符 ? 可以进行两种限定：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;? extends A
? super A&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;Class&amp;lt;T&amp;gt;&lt;/code&gt; 和 &lt;code&gt;Class&amp;lt;?&amp;gt;&lt;/code&gt; 区别&lt;/h4&gt;
&lt;p&gt;前面介绍了 ？ 和 T 的区别，那么对于，&lt;code&gt;Class&amp;lt;T&amp;gt;&lt;/code&gt; 和 &lt;code&gt;&amp;lt;Class&amp;lt;?&amp;gt;&lt;/code&gt; 又有什么区别呢？&lt;br /&gt;
&lt;code&gt;Class&amp;lt;T&amp;gt;&lt;/code&gt; 和 &lt;code&gt;Class&amp;lt;?&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;最常见的是在反射场景下的使用，这里以用一段发射的代码来说明下。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 通过反射的方式生成  multiLimit 
// 对象，这里比较明显的是，我们需要使用强制类型转换
MultiLimit multiLimit = (MultiLimit)
Class.forName(&quot;com.syuez.MultiLimit&quot;).newInstance();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于上述代码，在运行期，如果反射的类型不是 MultiLimit 类，那么一定会报 java.lang.ClassCastException 错误。&lt;/p&gt;
&lt;p&gt;对于这种情况，则可以使用下面的代码来代替，使得在在编译期就能直接检查到类型的问题：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class Test3 {
    public static &amp;lt;T&amp;gt; T createInstance(Class&amp;lt;T&amp;gt; clazz) throws IllegalAccessException, InstantiationException {
        return clazz.newInstance();
    }

    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        A a = createInstance(A.class);
        B b = createInstance(B.class);
    }
}

class A {}
class B {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Class&amp;lt;T&amp;gt;&lt;/code&gt; 在实例化的时候，T 要替换成具体类。&lt;code&gt;Class&amp;lt;?&amp;gt;&lt;/code&gt; 它是个通配泛型，? 可以代表任何类型，所以主要用于声明时的限制情况。比如，我们可以这样做申明：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 可以
public Class&amp;lt;?&amp;gt; clazz;
// 不可以，因为 T 需要指定类型
public Class&amp;lt;T&amp;gt; clazzT;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以当不知道定声明什么类型的 Class 的时候可以定义一 个&lt;code&gt;Class&amp;lt;?&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;那如果也想 &lt;code&gt;public Class&amp;lt;T&amp;gt; clazzT;&lt;/code&gt; 这样的话，就必须让当前的类也指定 T &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class Test3&amp;lt;T&amp;gt; {
    public Class&amp;lt;?&amp;gt; clazz;
    // 不会报错
    public Class&amp;lt;T&amp;gt; clazzT;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://juejin.cn/post/6844903917835419661&quot;&gt;聊一聊-JAVA 泛型中的通配符 T，E，K，V，？ - 掘金 (juejin.cn)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/JAVA%E6%B3%9B%E5%9E%8B%E4%B8%AD%E7%9A%84%E9%80%9A%E9%85%8D%E7%AC%A6_T_E_K_V_%EF%BC%9F.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/JAVA%E6%B3%9B%E5%9E%8B%E4%B8%AD%E7%9A%84%E9%80%9A%E9%85%8D%E7%AC%A6_T_E_K_V_%EF%BC%9F.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>SpringBoot通过不同的策略动态调用不同的实现类</title>
            <description>
            &lt;!--
author: admin
date: 2022-09-15
title: SpringBoot通过不同的策略动态调用不同的实现类
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;SpringBoot通过不同的策略动态调用不同的实现类&lt;/h1&gt;
&lt;h4&gt;前言&lt;/h4&gt;
&lt;p&gt;经常遇到这样的一个需求，前端传的实体类型相同，后端需要根据实体类中的某一个字符串，动态地调用某一个类的方法。&lt;/p&gt;
&lt;p&gt;在 SpringBoot 中，我们可以理解成，一个 Controller 接口对应多个ServiceImpl ，使用这种方式，如果后期需要添加一个功能，仅仅创建一个 ServiceImpl 就可以满足需求，而不用再额外创建一个 Controller 接口。&lt;/p&gt;
&lt;p&gt;现在假设一个情景，前端传入不同的用户类型，后端返回该用户的任务。你可能问我，为什么不直接把（用户类型，用户任务）存入数据库？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;现在只是一个简单的场景而已，实际中更为复杂，无法直接存入数据库。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;实现&lt;/h4&gt;
&lt;p&gt;我们先定义一个接口：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public interface UserService {
    /**
     * 返回用户的主要任务
     * @return 任务
     */
    String task();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两个实现类：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Service(&quot;student&quot;)
public class StudentService implements UserService{
    @Override
    public String task() {
        return &quot;学习&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Service(&quot;teacher&quot;)
public class TeacherService implements UserService{
    @Override
    public String task() {
        return &quot;教书&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实现动态调用的核心类&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Service
public class UserContext {
    @Autowired
    private Map&amp;lt;String, UserService&amp;gt; userMap;

    public UserService getUserService(String type) {
        return userMap.get(type);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Spring会自动地将形如（&lt;code&gt;@Service&lt;/code&gt;后面的名称，实现该接口的类）注入到该&lt;code&gt;userMap&lt;/code&gt;中&lt;/p&gt;
&lt;p&gt;在启动后，&lt;code&gt;userMap&lt;/code&gt;中就存在两个元素（&amp;quot;student&amp;quot;，StudentService）与（&amp;quot;teacher&amp;quot;，TeacherService）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;getUserService&lt;/code&gt;方法返回&lt;code&gt;userMap&lt;/code&gt;中&lt;code&gt;key=type&lt;/code&gt;的&lt;code&gt;UserService&lt;/code&gt;对象&lt;/p&gt;
&lt;p&gt;实体类：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Data
public class User {
    /**
     * 类型
     */
    private String type;
    /**
     * 任务
     */
    private String task;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Controller 层接口：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Slf4j
@RestController
@RequestMapping(&quot;/user&quot;)
public class UserController {
    @Autowired
    private UserContext context;

    @PostMapping(&quot;/get-task&quot;)
    public String getTask(@RequestBody User user) {
        UserService service = context.getUserService(user.getType());
        log.info(&quot;User Service Task is {}&quot;, service.task());
        return service.task();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 Spring 自带的 RestTemplate 来测试，先创建配置类：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        // 超时设置
        factory.setReadTimeout(60000); // ms
        factory.setConnectTimeout(60000);// ms
        return factory;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编写测试类：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@SpringBootTest
class SpringDynamicCallClassApplicationTests {

    @Autowired
    private RestTemplate restTemplate;

    @Test
    void restTest() throws JSONException {
        HttpHeaders headers = new HttpHeaders();
        // 因为 UserController 使用了 @RequestBody 注解，所以需要 POST Json
        headers.setContentType(MediaType.APPLICATION_JSON);

        JSONObject UserJsonObject = new JSONObject();
        UserJsonObject.put(&quot;type&quot;, &quot;student&quot;);
        UserJsonObject.put(&quot;task&quot;, &quot;学习&quot;);

        HttpEntity&amp;lt;String&amp;gt; request =
                new HttpEntity&amp;lt;&amp;gt;(UserJsonObject.toString(), headers);

        String UserResultAsJsonStr =
                restTemplate.postForObject(&quot;http://localhost:8080/user/get-task&quot;, request, String.class);

        System.out.println(UserResultAsJsonStr);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行结果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/8f6aa64e-344e-4d48-883e-31ce607a1aff.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/6095f37d-71bd-4198-a42e-9a64f2e1ce1c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文参考：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/qq_38377774/article/details/110422906&quot;&gt;springboot通过不同的策略动态调用不同的实现类_《小书生》的博客-CSDN博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/rest-template&quot;&gt;A Guide to the RestTemplate | Baeldung&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringBoot%E9%80%9A%E8%BF%87%E4%B8%8D%E5%90%8C%E7%9A%84%E7%AD%96%E7%95%A5%E5%8A%A8%E6%80%81%E8%B0%83%E7%94%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AE%9E%E7%8E%B0%E7%B1%BB.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringBoot%E9%80%9A%E8%BF%87%E4%B8%8D%E5%90%8C%E7%9A%84%E7%AD%96%E7%95%A5%E5%8A%A8%E6%80%81%E8%B0%83%E7%94%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AE%9E%E7%8E%B0%E7%B1%BB.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Java Thread 的一点总结3</title>
            <description>
            &lt;!--
author: admin
date: 2022-09-07
title: Java Thread 的一点总结3
tags: 多线程,并发
category: java
status: publish
summary: 这个 Java 并发可真难学~
--&gt;
&lt;h1&gt;Java Thread 的一点总结3&lt;/h1&gt;
&lt;p&gt;Java 多线程中的名称太多了，丈二和尚摸不着头脑，这里浅显的尝试整理下。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Runnable 和 Callable 表示要执行的异步任务(Task)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Runnable 没有返回结果，不会抛出异常&lt;/p&gt;
&lt;p&gt;Callable 有返回结果，会抛出异常&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Executor 和 ExecutorService 表示执行服务&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;执行服务封装了任务执行的细节，对于任务提交者而言，它可以关注于任务本身，如提交任务、获取结果、取消任务，而不需要关注任务执行的细节，如线程创建、任务调度、线程关闭等等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Future 表示异步任务的结果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;异步任务一般是没有返回值的，如果想要返回值就用 Future 来接收。&lt;/p&gt;
&lt;p&gt;Future 是一个重要的概念，是实现“任务的提交”与”任务的执行“相分离的关键，是其中的”纽带“，任务提交者和任务执行服务通过它隔离各自的关注点，同时进行协作。&lt;/p&gt;
&lt;p&gt;有了 Future 之后，你就可以在提交任务之后先执行别的，等到这边有结果了再取，这就是一种分离。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Executors 是一个工具类，类似于 Collections&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Executors 提供工厂方法来创建不同类型的线程池，比如 FixedThreadPool 或 CachedThreadPool。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Executor vs ExecutorService vs Executors&lt;/p&gt;
&lt;p&gt;这三者均是 Executor 框架中的一部分。Java 开发者很有必要学习和理解他们，以便更高效的使用 Java 提供的不同类型的线程池。这三者间的区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Executor 和 ExecutorService 这两个接口主要的区别是：ExecutorService 接口继承了 Executor 接口，是 Executor 的子接口&lt;/li&gt;
&lt;li&gt;Executor 和 ExecutorService 第二个区别是：Executor 接口定义了 execute()方法用来接收一个Runnable接口的对象，而 ExecutorService 接口中的 submit()方法可以接受Runnable和Callable接口的对象&lt;/li&gt;
&lt;li&gt;Executor 和 ExecutorService 接口第三个区别是 Executor 中的 execute() 方法不返回任何结果，而 ExecutorService 中的 submit()方法可以通过一个 Future 对象返回运算结果&lt;/li&gt;
&lt;li&gt;Executor 和 ExecutorService 接口第四个区别是除了允许客户端提交一个任务，ExecutorService 还提供用来控制线程池的方法。比如：调用 shutDown() 方法终止线程池&lt;/li&gt;
&lt;li&gt;Executors 类提供工厂方法用来创建不同类型的线程池。比如: newSingleThreadExecutor() 创建一个只有一个线程的线程池，newFixedThreadPool(int numOfThreads)来创建固定线程数的线程池，newCachedThreadPool()可以根据需要创建新的线程，但如果已有线程是空闲的会重用已有线程&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Executor、ExecutorService、Future、Callable 的全貌&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/7da5fb2f-df08-4438-a679-450796babdae.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一边看图一边阅读以下描述应该能便于理解大致的流程。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thread 调用 Runnable 的 run 方法&lt;/li&gt;
&lt;li&gt;Executor 调用 Runnable 的 run 方法&lt;/li&gt;
&lt;li&gt;FutureTask 实现(implements)了 Runnable 和 Future&lt;/li&gt;
&lt;li&gt;Executor 调用 Callable 的 call 方法&lt;/li&gt;
&lt;li&gt;ExecutorService 调用 Callable 的call 方法，返回(return) Future&lt;/li&gt;
&lt;li&gt;ExecutorService 调用 Runnable 的 run 方法，返回(return) Future&lt;/li&gt;
&lt;li&gt;Executors 创建(create) ThreadFactory、ExecutorService、ScheduledExecutorService、Callable&lt;/li&gt;
&lt;/ul&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/JavaThread%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%BB%E7%BB%933.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/JavaThread%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%BB%E7%BB%933.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring中的定时任务</title>
            <description>
            &lt;!--
author: admin
date: 2022-09-05
title: Spring中的定时任务
tags: Spring,异步
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring中的定时任务&lt;/h1&gt;
&lt;h3&gt;@Scheduled 注解&lt;/h3&gt;
&lt;p&gt;在 Spring 中，@Scheduled 注解用来配置和安排任务。使用它标注的方法应当满足两点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;方法没有返回值(void)，即使有也会被忽略&lt;/li&gt;
&lt;li&gt;方法不应该有任何参数&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;启用 Scheduled&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
@EnableScheduling
public class SpringConfig {
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;按固定延迟安排任务&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Scheduled(fixedDelay = 1000)
public void scheduleFixedDelayTask() {
    System.out.println(
      &quot;Fixed delay task - &quot; + System.currentTimeMillis() / 1000);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这种情况下，上一次执行结束和下一次执行开始之间的时间是固定的。该任务总是等待，直到前一个任务完成。&lt;/p&gt;
&lt;p&gt;当强制要求在再一次运行前需要完成前一次的执行时，应该使用这个选项。&lt;/p&gt;
&lt;h4&gt;按固定速率计划任务&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Scheduled(fixedRate = 1000)
public void scheduleFixedRateTask() {
    System.out.println(
      &quot;Fixed rate task - &quot; + System.currentTimeMillis() / 1000);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当每个任务的执行都是独立的时候，应该使用这个选项。&lt;/p&gt;
&lt;p&gt;请注意，计划任务在默认情况下不是并行的。因此，即使我们使用 fixedRate，在前一个任务完成之前，下一个任务也不会被调用。&lt;/p&gt;
&lt;p&gt;如果我们想在计划任务中支持并行行为，我们需要添加&lt;code&gt;@Async&lt;/code&gt;注解：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@EnableAsync
public class ScheduledFixedRateExample {
    @Async
    @Scheduled(fixedRate = 1000)
    public void scheduleFixedRateTaskAsync() throws InterruptedException {
        System.out.println(
          &quot;Fixed rate task async - &quot; + System.currentTimeMillis() / 1000);
        Thread.sleep(2000);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以使用Spring的&lt;code&gt;@Scheduled&lt;/code&gt;注解来运行一个计划任务，但是基于fixedDelay 和 fixedRate 属性，执行的性质会发生变化。&lt;/p&gt;
&lt;p&gt;fixedDelay 属性可以确保在执行任务的结束时间和下一次执行任务的开始时间之间有一个n毫秒的延迟。&lt;/p&gt;
&lt;p&gt;当我们需要确保一直只有一个任务的实例在运行时，这个属性特别有用。对于依赖性工作，它是相当有帮助的。&lt;/p&gt;
&lt;p&gt;fixedRate 属性每隔 n 毫秒运行一次计划任务。它不检查任务的任何先前的执行情况。&lt;/p&gt;
&lt;p&gt;当任务的所有执行都是独立的时候，这很有用。如果我们不期望超过内存和线程池的大小，fixedRate 应该是相当方便的。&lt;/p&gt;
&lt;p&gt;不过，如果传入的任务不能迅速完成，它们有可能以 &amp;quot;内存不足的异常 &amp;quot;而告终。&lt;/p&gt;
&lt;h4&gt;并行运行任务&lt;/h4&gt;
&lt;p&gt;默认情况下，Spring 使用本地单线程调度器来运行任务。因此，即使我们有多个@Scheduled 方法，它们都需要等待线程完成对前一个任务的执行。&lt;/p&gt;
&lt;p&gt;如果我们的任务是真正独立的，那么并行运行它们会更方便。为此，我们需要提供一个更适合我们需求的 TaskScheduler：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Bean
public TaskScheduler  taskScheduler() {
    ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
    threadPoolTaskScheduler.setPoolSize(5);
    threadPoolTaskScheduler.setThreadNamePrefix(&quot;ThreadPoolTaskScheduler&quot;);
    return threadPoolTaskScheduler;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面的例子中，我们将 TaskScheduler 的池子大小配置为5个，但请记住，实际配置应该根据自己的具体需要进行微调。&lt;/p&gt;
&lt;p&gt;如果我们使用 Spring Boot，我们可以利用一个更方便的方法来增加调度器的池大小。&lt;/p&gt;
&lt;p&gt;只需设置spring.task.scheduling.pool.size属性即可:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;spring.task.scheduling.pool.size=5&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;来源：&lt;a href=&quot;https://www.baeldung.com/spring-scheduled-tasks&quot;&gt;The @Scheduled Annotation in Spring | Baeldung&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Task Scheduler&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;TaskScheduler&lt;/code&gt; 是在 Spring 3.0 中引入的，它有多种方法可以在未来的某个时间点运行，它还会返回一个 &lt;code&gt;ScheduledFuture&amp;lt;V&amp;gt;&lt;/code&gt; 接口的表示对象，可以用来取消scheduled task 或检查它是否已经完成。&lt;/p&gt;
&lt;p&gt;All we need to do is to select a runnable task for scheduling then select a proper scheduling policy.&lt;/p&gt;
&lt;p&gt;我们需要做的就是选择一个可运行的任务进行调度，然后选择一个合适的调度策略。&lt;/p&gt;
&lt;h4&gt;ThreadPoolTaskScheduler&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ThreadPoolTaskScheduler&lt;/code&gt;非常适合内部线程管理，因为它将任务委托给&lt;code&gt;ScheduledExecutorService&lt;/code&gt;并实现了&lt;code&gt;TaskExecutor&lt;/code&gt;接口--所以它的单个实例能够处理异步的潜在执行以及&lt;code&gt;@Scheduled&lt;/code&gt;注释。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
@ComponentScan(
  basePackages=&quot;com.baeldung.taskscheduler&quot;,
  basePackageClasses={ThreadPoolTaskSchedulerExamples.class})
public class ThreadPoolTaskSchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
        ThreadPoolTaskScheduler threadPoolTaskScheduler
          = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(5);
        threadPoolTaskScheduler.setThreadNamePrefix(
          &quot;ThreadPoolTaskScheduler&quot;);
        return threadPoolTaskScheduler;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置的Bean threadPoolTaskScheduler 可以根据配置的5个池的大小异步执行任务。&lt;/p&gt;
&lt;p&gt;请注意，所有与 ThreadPoolTaskScheduler 相关的线程名称都将以ThreadPoolTaskScheduler 为前缀。&lt;/p&gt;
&lt;p&gt;让我们实现一个简单的任务，然后我们可以安排：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;class RunnableTask implements Runnable{
    private String message;

    public RunnableTask(String message){
        this.message = message;
    }

    @Override
    public void run() {
        System.out.println(new Date()+&quot; Runnable Task with &quot;+message
          +&quot; on thread &quot;+Thread.currentThread().getName());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们现在可以简单地安排这个任务由调度器执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;taskScheduler.schedule(
  new Runnabletask(&quot;Specific time, 3 Seconds from now&quot;),
  new Date(System.currentTimeMillis + 3000)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;taskScheduler 将在一个已知的日期安排这个可运行的任务，正好是当前时间的3秒后。&lt;/p&gt;
&lt;p&gt;现在让我们更深入地了解一下 ThreadPoolTaskScheduler 的调度机制。&lt;/p&gt;
&lt;h4&gt;Schedule Runnable Task With Fixed Delay(固定延迟)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;taskScheduler.scheduleWithFixedDelay(
  new RunnableTask(&quot;Fixed 1 second Delay&quot;), 1000); 

taskScheduler.scheduleWithFixedDelay(
  new RunnableTask(&quot;Current Date Fixed 1 second Delay&quot;),
  new Date(),
  1000);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Scheduling at a Fixed Rate(固定速率)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;taskScheduler.scheduleAtFixedRate(
  new RunnableTask(&quot;Fixed Rate of 2 seconds&quot;) , 2000);

taskScheduler.scheduleAtFixedRate(new RunnableTask(
  &quot;Fixed Rate of 2 seconds&quot;), new Date(), 3000);&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;来源：&lt;a href=&quot;https://www.baeldung.com/spring-task-scheduler&quot;&gt;A Guide to the Spring Task Scheduler | Baeldung&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;ThreadPoolTaskScheduler与ThreadPoolTaskExecutor&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html&quot;&gt;ThreadPoolTaskExecutor&lt;/a&gt;是一个专门用于执行任务的类。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskScheduler.html&quot;&gt;ThreadPoolTaskScheduler&lt;/a&gt;是一个专门用于调度任务的类。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个ThreadPoolTaskExecutor通过它的corePoolSize ， maxPoolSize ， keepAliveSeconds和queueCapacity属性在&lt;a href=&quot;https://so.csdn.net/so/search?q=%E7%BA%BF%E7%A8%8B%E6%B1%A0&amp;amp;spm=1001.2101.3001.7020&quot;&gt;线程池&lt;/a&gt;中提供细粒度的配置。 诸如ThreadPoolTaskScheduler这样的调度器不提供这样的配置。&lt;/p&gt;
&lt;p&gt;因此，在两者之间进行选择归结为以下问题：是否需要执行或计划执行任务？根据不同的用途去选择就可以&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;来源：&lt;a href=&quot;https://stackoverflow.com/questions/33453722/spring-threadpooltaskscheduler-vs-threadpooltaskexecutor&quot;&gt;task - Spring ThreadPoolTaskScheduler vs ThreadPoolTaskExecutor - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>SpringBoot缓存之基于API的Redis缓存实现</title>
            <description>
            &lt;!--
author: admin
date: 2022-08-27
title: SpringBoot缓存之基于API的Redis缓存实现
tags: Spring,Redis,NoSQL
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;SpringBoot缓存之基于API的Redis缓存实现&lt;/h1&gt;
&lt;p&gt;在 SpringBoot 整合 Redis 缓存实现中，除了基于注解形式的 Redis 缓存实现外，还有一种开发中常用的方式——基于 API 的 Redis 缓存实现。&lt;/p&gt;
&lt;h4&gt;数据准备&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;--
-- 数据库： `springbootdata`
--

-- --------------------------------------------------------

--
-- 表的结构 `t_article`
--

CREATE TABLE `t_article` (
  `id` int(20) NOT NULL COMMENT &#039;文章id&#039;,
  `title` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT &#039;文章标题&#039;,
  `content` longtext COLLATE utf8mb4_unicode_ci COMMENT &#039;文章内容&#039;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT=&#039;文章表&#039;;

--
-- 转存表中的数据 `t_article`
--

INSERT INTO `t_article` (`id`, `title`, `content`) VALUES
(1, &#039;Spring Boot 基础入门&#039;, &#039;从入门到精通讲解...&#039;),
(2, &#039;Spring Cloud 基础入门&#039;, &#039;从入门到放弃...&#039;),
(3, &#039;点什么外卖呢&#039;, &#039;老梁干挑面吧&#039;),
(4, &#039;肯德基疯狂星期四&#039;, &#039;不是很便宜啊，炒作吧！&#039;);

-- --------------------------------------------------------

--
-- 表的结构 `t_comment`
--

CREATE TABLE `t_comment` (
  `id` int(20) NOT NULL COMMENT &#039;评论id&#039;,
  `content` longtext COLLATE utf8mb4_unicode_ci NOT NULL COMMENT &#039;评论内容&#039;,
  `author` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT &#039;评论作者&#039;,
  `a_id` int(20) DEFAULT NULL COMMENT &#039;文章关联的id&#039;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT=&#039;评论表&#039;;

--
-- 转存表中的数据 `t_comment`
--

INSERT INTO `t_comment` (`id`, `content`, `author`, `a_id`) VALUES
(1,&#039;写得什么玩意&#039;, &#039;张三&#039;, 4)
(2, &#039;你好帅&#039;, &#039;tom&#039;, 1),
(3, &#039;很详细&#039;, &#039;kitty&#039;, 1),
(4, &#039;他吃肯德基从来不是星期四&#039;, &#039;马冬梅&#039;, 4)
(5, &#039;这是网红店吧&#039;, &#039;李四&#039;, 3)
(6, &#039;写的不错喔，有前途&#039;, &#039;周杰伦&#039;, 2);

--
-- 转储表的索引
--

--
-- 表的索引 `t_article`
--
ALTER TABLE `t_article`
  ADD PRIMARY KEY (`id`);

--
-- 表的索引 `t_comment`
--
ALTER TABLE `t_comment`
  ADD PRIMARY KEY (`id`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 MySQL 数据库中创建以上数据。&lt;/p&gt;
&lt;h4&gt;导入依赖&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-data-jpa&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;创建实体类&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;

@Entity(name = &quot;t_comment&quot;) // 设置 ORM 实体类，并指定映射的表名
@Data
public class Comment implements Serializable {
    @Id  // 表明映射对应的主键 id
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 设置主键自增策略
    private Integer id;

    private String content;
    private String author;

    @Column(name = &quot;a_id&quot;)  // 指定映射的表字段名
    private Integer aId;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里创建一个评论的实体类，默认情况下，数据表中的字段对应实体类对象的属性，也可以用&lt;code&gt;@Column&lt;/code&gt;注解指定数据表的字段名。并且用 Serializable 接口来实现 JDK 序列化机制，否则查询缓存时 Redis 会报错。&lt;/p&gt;
&lt;h4&gt;创建数据Repository&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.syuez.springcache.entity.Comment;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

public interface CommentRepository extends JpaRepository&amp;lt;Comment, Integer&amp;gt; {
    /**
     * 根据评论 id 修改评价作者 author
     * @param author 评价作者
     * @param id 评论 id
     * @return 数据库受影响条目数量
     */
    @Transactional
    @Modifying
    @Query(&quot;UPDATE t_comment c SET c.author = ?1 WHERE c.id = ?2&quot;)
    public int updateComment(String author, Integer id);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编写数据库操作的 Repository 接口文件，该接口继承自 JpaRepository，其中&lt;code&gt;&amp;lt;Comment, Integer&amp;gt;&lt;/code&gt;表示实体类和主键类型。&lt;/p&gt;
&lt;h4&gt;编写服务类&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.syuez.springcache.entity.Comment;
import com.syuez.springcache.repository.CommentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Optional;
import java.util.concurrent.TimeUnit;

@Service
public class ApiCommentService {
    @Autowired
    private CommentRepository commentRepository;
    @Autowired
    private RedisTemplate redisTemplate;

    public Comment findById(int commentId) {
        // 先从 Redis 缓存中查询数据
        Object object = redisTemplate.opsForValue().get(&quot;comment_&quot; + commentId);
        if(object != null) {
            return (Comment) object;
        } else {
            // 缓存中没有，就进入数据库查询
            Optional&amp;lt;Comment&amp;gt; optional = commentRepository.findById(commentId);
            if(optional.isPresent()) {
                Comment comment = optional.get();
                // 将查询结果进行缓存，并设置有效期为 1 分钟
                redisTemplate.opsForValue().set(&quot;comment_&quot; + commentId, comment, 1, TimeUnit.MINUTES);

                return comment;
            } else {
                return null;
            }
        }
    }
    public Comment updateComment(Comment comment) {
        commentRepository.updateComment(comment.getAuthor(), comment.getAId());
        // 更新数据后进行缓存更新
        redisTemplate.opsForValue().set(&quot;comment_&quot; + comment.getId(), comment);
        return comment;
    }
    public void deleteComment(int commentId) {
        commentRepository.deleteById(commentId);
        // 删除数据后进行缓存删除
        redisTemplate.delete(&quot;comment_&quot; + commentId);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首先使用&lt;code&gt;@Autowired&lt;/code&gt;注解将 RedisTemplate 作为组件注入 Spring 容器，然后定义了&lt;code&gt;findById()&lt;/code&gt;、&lt;code&gt;updateComment()&lt;/code&gt;、&lt;code&gt;deleteComment()&lt;/code&gt;三个方法，分别用于查询缓存、更新缓存以及删除缓存。当对数据进行缓存管理时，为了避免与其他业务的缓存数据混淆，对 Comment 数据缓存管理时，手动设置了前缀&lt;code&gt;comment_&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;关于 Redis API 中的 RedisTemplate 的更多用法，具体介绍如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RedisTemplate  是 Spring Data Redis 提供的直接进行 Redis 操作的 Java API，可以直接注入，相对于传统的 Jedis 更加简便。&lt;/li&gt;
&lt;li&gt;RedisTemplate 可以操作&lt;code&gt;&amp;lt;Object, Object&amp;gt;&lt;/code&gt;对象类型数据，而其子类 StringRedisTemplate 则是专门针对&lt;code&gt;&amp;lt;String, String&amp;gt;&lt;/code&gt;字符串类型的数据进行操作。&lt;/li&gt;
&lt;li&gt;RedisTemplate 类中提供了很多进行数据缓存操作的方法，可以进行数据缓存查询、缓存更新、缓存修改、缓存删除以及设置缓存有效期等等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上述示例中，&lt;code&gt;redisTemplate.opsForValue().set(&quot;comment_&quot; + commentId, comment, 1, TimeUnit.MINUTES);&lt;/code&gt;设置缓存数据的同时，将缓存有效期设置为1天时间(倒数第一个参数还可以设置其他时间单位，如天、小时、分钟、秒等等)；当然，还可以先设置缓存有效期，再设置缓存数据。&lt;/p&gt;
&lt;h4&gt;编写控制器&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.syuez.springcache.entity.Comment;
import com.syuez.springcache.service.ApiCommentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(&quot;/api&quot;) // 窄化请求路径
public class ApiCommentController {
    @Autowired
    private ApiCommentService apiCommentService;

    @GetMapping(&quot;/get/{id}&quot;)
    public Comment findById(@PathVariable(&quot;id&quot;) int commentId) {
        return apiCommentService.findById(commentId);
    }

    @GetMapping(&quot;/update/{id}/{author}&quot;)
    public Comment updateComment(@PathVariable(&quot;id&quot;) int commentId, @PathVariable(&quot;author&quot;) String author) {
        Comment comment = apiCommentService.findById(commentId);
        comment.setAuthor(author);
        return apiCommentService.updateComment(comment);
    }

    @GetMapping(&quot;/delete/{id}&quot;)
    public void deleteComment(@PathVariable(&quot;id&quot;) int commentId) {
        apiCommentService.deleteComment(commentId);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;@RequestMapping(&quot;/api&quot;)&lt;/code&gt;作用于 ApiCommentController 类，该类的所有方法都将映射为&lt;code&gt;/api&lt;/code&gt;路径下的请求。&lt;code&gt;@Autowired&lt;/code&gt;用于装配 ApiCommentService 对象，方便调用 ApiCommentService 中的相关方法进行数据查询、修改和删除。&lt;/p&gt;
&lt;h3&gt;自定义 Redis 缓存序列化机制&lt;/h3&gt;
&lt;p&gt;虽然实现了 Spring Boot 整合 Redis 进行数据的缓存管理，但缓存管理的实体类数据使用的是 JDK 序列化机制，不便于使用可视化管理工具进行查看和管理(因为使用 JDK 序列化后，在 Redis 存储的缓存是以十六进制保存的)。这里我们通过自定义 RedisTemplate 和 自定义 JSON 格式的数据序列化机制进行数据缓存管理。&lt;/p&gt;
&lt;h4&gt;自定义 RedisTemplate&lt;/h4&gt;
&lt;p&gt;如果想要使用自定义序列化方式的 RedisTemplate 进行数据缓存操作，需要创建一个名为 redisTemplate 的 Bean 组件，并在该组件中设置对应的序列化方式。&lt;/p&gt;
&lt;p&gt;创建一个 Redis 自定义配置类 RedisConfig。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.*;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.*;

@Configuration  // 定义一个配置类
public class RedisConfig {
    @Bean
    public RedisTemplate&amp;lt;Object, Object&amp;gt; redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate&amp;lt;Object, Object&amp;gt; template = new RedisTemplate&amp;lt;&amp;gt;();
        template.setConnectionFactory(redisConnectionFactory);
        // 使用 JSON 格式化序列化对象，对缓存数据 key 和 value 进行转换
        Jackson2JsonRedisSerializer&amp;lt;Object&amp;gt; jacksonSeial = new Jackson2JsonRedisSerializer&amp;lt;&amp;gt;(Object.class);
        // 解决查询缓存转换异常的问题
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        /*
        enableDefaultTyping 方法从 2.10.0 开始标记为过期
        https://segon.cn/jackson-objectmapper-enabledefaulttyping-deprecated.html
         */
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonSeial.setObjectMapper(objectMapper);
        // 设置 RedisTemplate 模板 API 的序列化方式为 JSON
        template.setDefaultSerializer(jacksonSeial);
        return template;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述代码使用&lt;code&gt;@Configuration&lt;/code&gt;注解将 &lt;code&gt;RedisConfig&lt;/code&gt;标注为一个配置类，使用&lt;code&gt;@Bean&lt;/code&gt;注解注入一个默认名称为 &lt;code&gt;redisTemplate&lt;/code&gt;的组件。在 Bean 组件中，使用自定义的 &lt;code&gt;Jackson2JsonRedisSerializer&lt;/code&gt;数据序列化方式自定义一个 RedisTemplate，在定制序列化方式中，定义一个 ObjectMapper 用于进行数据转换设置。&lt;/p&gt;
&lt;h4&gt;效果测试&lt;/h4&gt;
&lt;p&gt;修改 &lt;code&gt;application.properties&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;# MySQL Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root#admin
# Display SQL Query
spring.jpa.show-sql=true

# Hikari Configuration
# minimum number of idle connections maintained by HikariCP in a connection pool
spring.datasource.hikari.minimum-idle=4
# maximum pool size
spring.datasource.hikari.maximum-pool-size=16
# maximum idle time for connection
spring.datasource.hikari.idle-timeout=600000
# maximum lifetime in milliseconds of a connection in the pool after it is closed
spring.datasource.hikari.max-lifetime=1800000
# maximum number of milliseconds that a client will wait for a connection
spring.datasource.hikari.connection-timeout=30000
# default auto-commit behavior
spring.datasource.hikari.auto-commit =true

# Tomcat Port
server.port=18443
server.address=localhost

# Redis Configuration
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动项目，项目启动成功后，通过浏览器访问 &lt;a href=&quot;http://localhost:18443/api/get/3&quot;&gt;http://localhost:18443/api/get/3&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;查看 id 为 3 的用户评论，并重复刷新浏览器查看同一条数据信息，查看控制台打印的 SQL 查询语句：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/5d3472f0-ff86-4a17-9ea3-e14e0147c039.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以看出，执行&lt;code&gt;findById()&lt;/code&gt;方法正确查询出用户评论信息 Comment；重复进行同样的查询操作，数据库只执行了一次 SQL 语句，说明定制的 Redis 缓存生效。&lt;/p&gt;
&lt;p&gt;使用 Redis 客户端可视化管理工具查看缓存数据：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/2658488f-423f-45ba-a65c-78af0a9025aa.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以看出，执行&lt;code&gt;findById&lt;/code&gt;方法查询出用户评论信息 Comment 正确存储到了 Redis 缓存中，且缓存到 Redis 的数据以 JSON 格式存储，说明自定义的 Redis API 模板工具生效了。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文摘自《Spring Boot 企业级开发教程》&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringBoot%E7%BC%93%E5%AD%98%E4%B9%8B%E5%9F%BA%E4%BA%8EAPI%E7%9A%84Redis%E7%BC%93%E5%AD%98%E5%AE%9E%E7%8E%B0.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringBoot%E7%BC%93%E5%AD%98%E4%B9%8B%E5%9F%BA%E4%BA%8EAPI%E7%9A%84Redis%E7%BC%93%E5%AD%98%E5%AE%9E%E7%8E%B0.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>SpringBoot整合Redis</title>
            <description>
            &lt;!--
author: admin
date: 2022-08-25
title: SpringBoot整合Redis
tags: Spring,Redis,NoSQL
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;SpringBoot整合Redis&lt;/h1&gt;
&lt;h4&gt;添加依赖&lt;/h4&gt;
&lt;p&gt;首先在项目中添加 Spring Data Redis 依赖启动器&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述添加的 Redis 依赖启动器代码中，没有编写对应的版本号信息，这是因为 Spring Boot 为 Redis 实现了自动配置，所以会统一管理版本号信息。&lt;/p&gt;
&lt;h4&gt;编写实体类&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;Person.java&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;

import java.util.List;

@RedisHash(&quot;persons&quot;) // 指定操作实体类对象在 Redis 数据库中的存储空间
@Data
public class Person {
    @Id  // 标识实体类主键
    private String id;
    @Indexed  // 标识对应属性在 Redis 数据库中生成二级索引
    private String firstname;
    @Indexed
    private String lastname;

    private Address address;

    private List&amp;lt;Family&amp;gt; families;

    public Person(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Address.java&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.redis.core.index.Indexed;

@Data
@AllArgsConstructor
public class Address {
    @Indexed
    private String city;
    @Indexed
    private String country;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Family.java&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.redis.core.index.Indexed;

@Data
@AllArgsConstructor
public class Family {
    @Indexed
    private String type;
    @Indexed
    private String username;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这些实体类中，针对面向 Redis 数据库的数据操作设置了几个主要注解，这几个注解的说明如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@RedisHash(&quot;persoon&quot;)&lt;/code&gt; 用于指定操作实体类对象在 Redis 数据库中的存储空间，此处表示针对 Person 实体类的数据操作都存储在 Redis 数据库中名为 persons 的存储空间下。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Id&lt;/code&gt; 用于标识实体类主键。在 Redis 数据库中会默认生成字符串形式的 HashKey 表示唯一的实体对象 id，当然也可以在数据存储时手动指定 id。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Indexed&lt;/code&gt; 用于标识对应属性在 Redis 数据库中生成二级索引。使用该注解后会在 Redis 数据库中生成属性对应的二级索引，索引名称就是属性名，可以方便地进行数据条件查询。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;编写 Repository 接口&lt;/h4&gt;
&lt;p&gt;Spring Boot 针对包括 Redis 在内的一些常用数据库提供了自动化配置，可以通过实现 Repository 接口简化对数据库中的数据进行的增删改查操作，这些操作方法与 Spring Data JPA 操作数据的使用方法基本相同，可以使用方法名关键字进行数据操作。&lt;/p&gt;
&lt;p&gt;创建操作 Person 实体类的 PersonRepository 接口。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.syuez.springbootredis.entity.Person;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface PersonRepository extends CrudRepository&amp;lt;Person, String&amp;gt; {
    List&amp;lt;Person&amp;gt; findByLastname(String lastname);
    Page&amp;lt;Person&amp;gt; findPersonByLastname(String lastname, Pageable page);
    List&amp;lt;Person&amp;gt; findByFirstnameAndLastname(String firstname, String lastname);
    List&amp;lt;Person&amp;gt; findByAddress_City(String city);
    List&amp;lt;Person&amp;gt; findByFamilies_Username(String username);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PersonRepository 接口继承自 CrudRepository 接口，该接口定义了若干查询方法。&lt;/p&gt;
&lt;p&gt;需要说明的是，在操作 Redis 数据库时编写的 Repository 接口文件需要继承 CrudRepository 接口，而不是继承 JpaRepository，这是因为 JpaRepository 是 Spring Boot 整合 JPA 特有的。当然，也可以在项目 pom.xml 文件中同时导入 Spring Boot 整合 JPA 依赖和 Redis 依赖，这样就可以编写一个继承 JpaRepository 的接口操作 Redis 数据库了。&lt;/p&gt;
&lt;h4&gt;Redis 连接配置&lt;/h4&gt;
&lt;p&gt;在项目的全局配置文件 application.properties 中添加 Redis 的连接配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;spring.redis.host=localhost
spring.redis.port=6379
# 密码默认为空
spring.redis.password= &lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;单元测试&lt;/h4&gt;
&lt;p&gt;编写单元测试进行接口方法测试。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;RedisTests.java&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.syuez.springbootredis.entity.Address;
import com.syuez.springbootredis.entity.Family;
import com.syuez.springbootredis.entity.Person;
import com.syuez.springbootredis.repository.PersonRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest
public class RedisTests {
    @Autowired
    private PersonRepository personRepository;

    @Test
    public void savePerson() {
        Person person = new Person(&quot;张&quot;,&quot;有才&quot;);
        Person person2 = new Person(&quot;James&quot;,&quot;Harden&quot;);
        // 创建并添加住址信息
        Address address = new Address(&quot;北京&quot;,&quot;China&quot;);
        person.setAddress(address);
        // 创建并添加家庭成员
        List&amp;lt;Family&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
        Family dad = new Family(&quot;父亲&quot;,&quot;张良&quot;);
        Family mom = new Family(&quot;母亲&quot;,&quot;李香君&quot;);
        list.add(dad);
        list.add(mom);
        person.setFamilies(list);
        Person save = personRepository.save(person);
        Person save2 = personRepository.save(person2);
        System.out.println(save);
        System.out.println(save2);
    }
    @Test
    public void selectPerson() {
        List&amp;lt;Person&amp;gt; list = personRepository.findByAddress_City(&quot;北京&quot;);
        System.out.println(list);
    }
    @Test
    public void updatePerson() {
        Person person =personRepository.findByFirstnameAndLastname(&quot;张&quot;,&quot;有才&quot;).get(0);
        person.setLastname(&quot;小明&quot;);
        Person update = personRepository.save(person);
        System.out.println(update);
    }
    @Test
    public void deletePerson() {
        Person person = personRepository.findByFirstnameAndLastname(&quot;张&quot;,&quot;有才&quot;).get(0);
        personRepository.delete(person);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里就 不展示测试结果了，可以使用 Redis 客户端可视化管理工具查看数据。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文摘自《Spring Boot 企业级开发教程》&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringBoot%E6%95%B4%E5%90%88Redis.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringBoot%E6%95%B4%E5%90%88Redis.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Redis入门(一)</title>
            <description>
            &lt;!--
author: admin
date: 2022-08-24
title: Redis入门(一)
tags: NoSQL
category: Redis
status: publish
summary: Redis 5种基础数据类型详解
--&gt;
&lt;h1&gt;Redis入门(一)&lt;/h1&gt;
&lt;h3&gt;什么是Redis&lt;/h3&gt;
&lt;p&gt;Redis是一款内存高速缓存数据库。Redis全称为：&lt;strong&gt;Remote Dictionary Server&lt;/strong&gt;（远程数据服务），使用C语言编写，Redis是一个key-value存储系统（键值存储系统），支持丰富的数据类型，如：String、list、set、zset、hash。&lt;/p&gt;
&lt;p&gt;Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存，事件发布或订阅，高速队列等场景。支持网络，提供字符串，哈希，列表，队列，集合结构直接存取，基于内存，可持久化。&lt;/p&gt;
&lt;h3&gt;为什么要使用Redis&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;一个产品的使用场景肯定是需要根据产品的特性，先列举一下Redis的特点：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;读写性能优异&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Redis能读的速度是110000次/s,写的速度是81000次/s &lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据类型丰富&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原子性&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Redis的所有操作都是原子性的，同时Redis还支持对几个操作全并后的原子性执行。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;丰富的特性&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Redis支持 publish/subscribe, 通知, key 过期等特性。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持久化&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Redis支持RDB, AOF等持久化方式&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发布订阅&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Redis支持发布/订阅模式&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分布式&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Redis Cluster&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Redis的使用场景&lt;/h3&gt;
&lt;h4&gt;热点数据的缓存&lt;/h4&gt;
&lt;p&gt;缓存是Redis最常见的应用场景，之所有这么使用，主要是因为Redis读写性能优异。而且逐渐有取代 memcached，成为首选服务端缓存的组件。而且，Redis内部是支持事务的，在使用时候能有效保证数据的一致性。&lt;/p&gt;
&lt;p&gt;作为缓存使用时，一般有两种方式保存数据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读取前，先去读Redis，如果没有数据，读取数据库，将数据拉入Redis。&lt;/li&gt;
&lt;li&gt;插入数据时，同时写入Redis。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;方案一：实施起来简单，但是有两个需要注意的地方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;避免缓存击穿。（数据库没有就需要命中的数据，导致Redis一直没有数据，而一直命中数据库。）&lt;/li&gt;
&lt;li&gt;数据的实时性相对会差一点。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;方案二：数据实时性强，但是开发时不便于统一处理。&lt;/p&gt;
&lt;p&gt;当然，两种方式根据实际情况来适用。如：方案一适用于对于数据实时性要求不是特别高的场景。方案二适用于字典表、数据量不大的数据存储。&lt;/p&gt;
&lt;h4&gt;限时业务的运用&lt;/h4&gt;
&lt;p&gt;redis中可以使用expire命令设置一个键的生存时间，到时间后redis会删除它。利用这一特性可以运用在限时的优惠活动信息、手机验证码等业务场景。&lt;/p&gt;
&lt;h4&gt;计数器相关问题&lt;/h4&gt;
&lt;p&gt;redis由于incrby命令可以实现原子性的递增，所以可以运用于高并发的秒杀活动、分布式序列号的生成、具体业务还体现在比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。&lt;/p&gt;
&lt;h4&gt;分布式锁&lt;/h4&gt;
&lt;p&gt;这个主要利用redis的setnx命令进行，setnx：&amp;quot;set if not exists&amp;quot;就是如果不存在则成功设置缓存同时返回1，否则返回0 ，这个特性在很多后台中都有所运用，因为我们服务器是集群的，定时任务可能在两台机器上都会运行，所以在定时任务中首先 通过setnx设置一个lock，
如果成功设置则执行，如果没有成功设置，则表明该定时任务已执行。 当然结合具体业务，我们可以给这个lock加一个过期时间，比如说30分钟执行一次的定时任务，那么这个过期时间设置为小于30分钟的一个时间就可以，这个与定时任务的周期以及定时任务执行消耗时间相关。&lt;/p&gt;
&lt;p&gt;在分布式锁的场景中，主要用在比如秒杀系统等。&lt;/p&gt;
&lt;h4&gt;延时操作&lt;/h4&gt;
&lt;p&gt;比如在订单生产后我们占用了库存，10分钟后去检验用户是否真正购买，如果没有购买将该单据设置无效，同时还原库存。 由于redis自2.8.0之后版本提供Keyspace Notifications功能，允许客户订阅Pub/Sub频道，以便以某种方式接收影响Redis数据集的事件。 所以我们对于上面的需求就可以用以下解决方案，我们在订单生产时，设置一个key，同时设置10分钟后过期， 我们在后台实现一个监听器，监听key的实效，监听到key失效时将后续逻辑加上。&lt;/p&gt;
&lt;p&gt;当然我们也可以利用rabbitmq、activemq等消息中间件的延迟队列服务实现该需求。&lt;/p&gt;
&lt;h4&gt;排行榜相关问题&lt;/h4&gt;
&lt;p&gt;关系型数据库在排行榜方面查询速度普遍偏慢，所以可以借助redis的SortedSet进行热点数据的排序。&lt;/p&gt;
&lt;p&gt;比如点赞排行榜，做一个SortedSet, 然后以用户的openid作为上面的username, 以用户的点赞数作为上面的score, 然后针对每个用户做一个hash, 通过zrangebyscore就可以按照点赞数获取排行榜，然后再根据username获取用户的hash信息，这个当时在实际运用中性能体验也蛮不错的。&lt;/p&gt;
&lt;h4&gt;点赞、好友等相互关系的存储&lt;/h4&gt;
&lt;p&gt;Redis 利用集合的一些命令，比如求交集、并集、差集等。&lt;/p&gt;
&lt;p&gt;在微博应用中，每个用户关注的人存在一个集合中，就很容易实现求两个人的共同好友功能。&lt;/p&gt;
&lt;h4&gt;简单队列&lt;/h4&gt;
&lt;p&gt;由于Redis有 &lt;code&gt;list push&lt;/code&gt; 和 &lt;code&gt;list pop&lt;/code&gt; 这样的命令，所以能够很方便的执行队列操作。&lt;/p&gt;
&lt;h3&gt;数据类型&lt;/h3&gt;
&lt;p&gt;Redis所有的 &lt;code&gt;key&lt;/code&gt;（键）都是字符串。我们在谈基础数据结构时，讨论的是存储值的数据类型，主要包括常见的5种数据类型，分别是：String、List、Set、Zset、Hash&lt;/p&gt;
&lt;h4&gt;Redis数据结构简介&lt;/h4&gt;
&lt;p&gt;Redis基础文章非常多，关于基础数据结构类型，我推荐你先看下&lt;a href=&quot;https://redis.io/topics/data-types&quot;&gt;官方网站内容 (opens new window)&lt;/a&gt;，然后再看下面的小结。&lt;/p&gt;
&lt;p&gt;首先对redis来说，所有的&lt;code&gt;key&lt;/code&gt;（键）都是字符串。我们在谈基础数据结构时，讨论的是存储值的数据类型，主要包括常见的5种数据类型，分别是：String、List、Set、Zset、Hash。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/4fa66ae7-d859-4c96-adb9-3c02d5a2cbf8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;结构类型&lt;/th&gt;
&lt;th&gt;结构存储的值&lt;/th&gt;
&lt;th&gt;结构的读写能力&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;String字符串&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;可以是字符串、整数或浮点数&lt;/td&gt;
&lt;td&gt;对整个字符串或字符串的一部分进行操作；对整数或浮点数进行自增或自减操作；&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;List列表&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;一个链表，链表上的每个节点都包含一个字符串&lt;/td&gt;
&lt;td&gt;对链表的两端进行push和pop操作，读取单个或多个元素；根据值查找或删除元素；&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Set集合&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;包含字符串的无序集合&lt;/td&gt;
&lt;td&gt;字符串的集合，包含基础的方法有看是否存在添加、获取、删除；还包含计算交集、并集、差集等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hash散列&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;包含键值对的无序散列表&lt;/td&gt;
&lt;td&gt;包含方法有添加、获取、删除单个元素&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zset有序集合&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;和散列一样，用于存储键值对&lt;/td&gt;
&lt;td&gt;字符串成员与浮点数分数之间的有序映射；元素的排列顺序由分数的大小决定；包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;基础数据结构详解&lt;/h3&gt;
&lt;h4&gt;String字符串&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;String是redis中最基本的数据类型，一个key对应一个value。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;String类型是二进制安全的，意思是 redis 的 string 可以包含任何数据。如数字，字符串，jpg图片或者序列化的对象。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/84f5e84e-9742-42df-ab27-053dd335d5d7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;简述&lt;/th&gt;
&lt;th&gt;使用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;获取存储在给定键中的值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SET&lt;/td&gt;
&lt;td&gt;设置存储在给定键中的值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SET name value&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEL&lt;/td&gt;
&lt;td&gt;删除存储在给定键中的值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DEL name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INCR&lt;/td&gt;
&lt;td&gt;将键存储的值加1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INCR key&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DECR&lt;/td&gt;
&lt;td&gt;将键存储的值减1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DECR key&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INCRBY&lt;/td&gt;
&lt;td&gt;将键存储的值加上整数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INCRBY key amount&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DECRBY&lt;/td&gt;
&lt;td&gt;将键存储的值减去整数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DECRBY key amount&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-redis&quot;&gt;127.0.0.1:6379&amp;gt; set hello world
OK
127.0.0.1:6379&amp;gt; get hello
&quot;world&quot;
127.0.0.1:6379&amp;gt; del hello
(integer) 1
127.0.0.1:6379&amp;gt; get hello
(nil)
127.0.0.1:6379&amp;gt; set counter 2
OK
127.0.0.1:6379&amp;gt; get counter
&quot;2&quot;
127.0.0.1:6379&amp;gt; incr counter
(integer) 3
127.0.0.1:6379&amp;gt; get counter
&quot;3&quot;
127.0.0.1:6379&amp;gt; incrby counter 100
(integer) 103
127.0.0.1:6379&amp;gt; get counter
&quot;103&quot;
127.0.0.1:6379&amp;gt; decr counter
(integer) 102
127.0.0.1:6379&amp;gt; get counter
&quot;102&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实战场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;缓存&lt;/strong&gt;： 经典使用场景，把常用信息，字符串，图片或者视频等信息放到redis中，redis作为缓存层，mysql做持久化层，降低mysql的读写压力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计数器&lt;/strong&gt;：redis是单线程模型，一个命令执行完才会执行下一个，同时数据可以一步落地到其他的数据源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;session&lt;/strong&gt;：常见方案spring session + redis实现session共享。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;List列表&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Redis中的List其实就是链表（Redis用双端链表实现List）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用List结构，我们可以轻松地实现最新消息排队功能（比如新浪微博的TimeLine）。List的另一个应用就是消息队列，可以利用List的 PUSH 操作，将任务存放在List中，然后工作线程再用 POP 操作将任务取出进行执行。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/b32f4aa7-6638-4bc4-b2f2-d936fe8cf41e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;简述&lt;/th&gt;
&lt;th&gt;使用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RPUSH&lt;/td&gt;
&lt;td&gt;将给定值推入到列表右端&lt;/td&gt;
&lt;td&gt;&lt;code&gt;RPUSH key value&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LPUSH&lt;/td&gt;
&lt;td&gt;将给定值推入到列表左端&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LPUSH key value&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPOP&lt;/td&gt;
&lt;td&gt;从列表的右端弹出一个值，并返回被弹出的值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;RPOP key&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LPOP&lt;/td&gt;
&lt;td&gt;从列表的左端弹出一个值，并返回被弹出的值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LPOP key&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LRANGE&lt;/td&gt;
&lt;td&gt;获取列表在给定范围上的所有值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LRANGE key 0 -1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LINDEX&lt;/td&gt;
&lt;td&gt;通过索引获取列表中的元素。你也可以使用负数下标，以 -1 表示列表的最后一个元素， -2 表示列表的倒数第二个元素，以此类推&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LINDEX key index&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;使用技巧：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lpush+lpop=Stack(栈)&lt;/li&gt;
&lt;li&gt;lpush+rpop=Queue（队列）&lt;/li&gt;
&lt;li&gt;lpush+ltrim=Capped Collection（有限集合）&lt;/li&gt;
&lt;li&gt;lpush+brpop=Message Queue（消息队列）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-redis&quot;&gt;127.0.0.1:6379&amp;gt; lpush mylist 1 2 ll ls mem
(integer) 5
127.0.0.1:6379&amp;gt; lrange mylist 0 -1
1) &quot;mem&quot;
2) &quot;ls&quot;
3) &quot;ll&quot;
4) &quot;2&quot;
5) &quot;1&quot;
127.0.0.1:6379&amp;gt; lindex mylist -1
&quot;1&quot;
127.0.0.1:6379&amp;gt; lindex mylist 10        # index不在 mylist 的区间范围内
(nil)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实战场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;微博TimeLine&lt;/strong&gt;: 有人发布微博，用lpush加入时间轴，展示新的列表信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;消息队列&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Set集合&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的，这就意味着集合中不能出现重复的数据&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Redis 中集合是通过哈希表实现的，所以添加，删除，查找的复杂度都是 O(1)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/a294e3c8-0aea-4681-85de-92f5f389b41f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;简述&lt;/th&gt;
&lt;th&gt;使用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SADD&lt;/td&gt;
&lt;td&gt;向集合添加一个或多个成员&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SADD key value&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCARD&lt;/td&gt;
&lt;td&gt;获取集合的成员数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SCARD key&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMEMBERS&lt;/td&gt;
&lt;td&gt;返回集合中的所有成员&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SMEMBERS key member&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SISMEMBER&lt;/td&gt;
&lt;td&gt;判断 member 元素是否是集合 key 的成员&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SISMEMBER key member&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;其它一些集合操作，请参考这里 &lt;a href=&quot;https://www.runoob.com/redis/redis-sets.html&quot;&gt;https://www.runoob.com/redis/redis-sets.html&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-redis&quot;&gt;127.0.0.1:6379&amp;gt; sadd myset hao hao1 xiaohao hao
(integer) 3
127.0.0.1:6379&amp;gt; smembers myset
1) &quot;xiaohao&quot;
2) &quot;hao1&quot;
3) &quot;hao&quot;
127.0.0.1:6379&amp;gt; sismember myset hao
(integer) 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实战场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;标签&lt;/strong&gt;（tag）,给用户添加标签，或者用户给消息添加标签，这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;点赞，或点踩，收藏等&lt;/strong&gt;，可以放到set中实现&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Hash散列&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Redis hash 是一个 string 类型的 field（字段） 和 value（值） 的映射表，hash 特别适合用于存储对象。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;index_files/ed3f9f81-771d-49b3-bdd1-203a83ec4964.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;简述&lt;/th&gt;
&lt;th&gt;使用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HSET&lt;/td&gt;
&lt;td&gt;添加键值对&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HSET hash-key sub-key1 value1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HGET&lt;/td&gt;
&lt;td&gt;获取指定散列键的值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HGET hash-key key1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HGETALL&lt;/td&gt;
&lt;td&gt;获取散列中包含的所有键值对&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HGETALL hash-key&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HDEL&lt;/td&gt;
&lt;td&gt;如果给定键存在于散列中，那么就移除这个键&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HDEL hash-key sub-key1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-redis&quot;&gt;127.0.0.1:6379&amp;gt; hset user name1 hao
(integer) 1
127.0.0.1:6379&amp;gt; hset user email1 hao@163.com
(integer) 1
127.0.0.1:6379&amp;gt; hgetall user
1) &quot;name1&quot;
2) &quot;hao&quot;
3) &quot;email1&quot;
4) &quot;hao@163.com&quot;
127.0.0.1:6379&amp;gt; hget user user
(nil)
127.0.0.1:6379&amp;gt; hget user name1
&quot;hao&quot;
127.0.0.1:6379&amp;gt; hset user name2 xiaohao
(integer) 1
127.0.0.1:6379&amp;gt; hset user email2 xiaohao@163.com
(integer) 1
127.0.0.1:6379&amp;gt; hgetall user
1) &quot;name1&quot;
2) &quot;hao&quot;
3) &quot;email1&quot;
4) &quot;hao@163.com&quot;
5) &quot;name2&quot;
6) &quot;xiaohao&quot;
7) &quot;email2&quot;
8) &quot;xiaohao@163.com&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实战场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;缓存&lt;/strong&gt;： 能直观，相比string更节省空间，的维护缓存信息，如用户信息，视频信息等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Zset有序集合&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;有序集合的成员是唯一的, 但分数(score)却可以重复。有序集合是通过两种数据结构实现：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;压缩列表(ziplist)&lt;/strong&gt;: ziplist是为了提高存储效率而设计的一种特殊编码的双向链表。它可以存储字符串或者整数，存储整数时是采用整数的二进制而不是字符串形式存储。它能在O(1)的时间复杂度下完成list两端的push和pop操作。但是因为每次操作都需要重新分配ziplist的内存，所以实际复杂度和ziplist的内存使用量相关&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跳跃表（zSkiplist)&lt;/strong&gt;: 跳跃表的性能可以保证在查找，删除，添加等操作的时候在对数期望时间内完成，这个性能是可以和平衡树来相比较的，而且在实现方面比平衡树要优雅，这是采用跳跃表的主要原因。跳跃表的复杂度是O(log(n))。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;index_files/3f748dc0-dfa2-4fea-b060-72765e43c4dd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;简述&lt;/th&gt;
&lt;th&gt;使用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ZADD&lt;/td&gt;
&lt;td&gt;将一个带有给定分值的成员添加到有序集合里面&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ZADD zset-key 178 member1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZRANGE&lt;/td&gt;
&lt;td&gt;根据元素在有序集合中所处的位置，从有序集合中获取多个元素&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ZRANGE zset-key 0-1 withccores&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZREM&lt;/td&gt;
&lt;td&gt;如果给定元素成员存在于有序集合中，那么就移除这个元素&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ZREM zset-key member1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-redis&quot;&gt;127.0.0.1:6379&amp;gt; zadd myscoreset 100 hao 90 xiaohao
(integer) 2
127.0.0.1:6379&amp;gt; ZRANGE myscoreset 0 -1
1) &quot;xiaohao&quot;
2) &quot;hao&quot;
127.0.0.1:6379&amp;gt; ZSCORE myscoreset hao
&quot;100&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实战场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;排行榜&lt;/strong&gt;：有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜，榜单可以按照用户关注数，更新时间，字数等打分，做排行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PS.  Q: &lt;a href=&quot;https://stackoverflow.com/questions/6851909/how-do-i-delete-everything-in-redis&quot;&gt;How do I delete everything in Redis?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A: With redis-cli:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://redis.io/commands/flushall&quot;&gt;FLUSHALL&lt;/a&gt; Remove all keys from all databases&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://redis.io/commands/flushdb&quot;&gt;FLUSHDB&lt;/a&gt; Remove all keys from the current database&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://redis.io/commands/script-flush&quot;&gt;SCRIPT FLUSH&lt;/a&gt; Remove all the scripts from the script cache.&lt;/p&gt;
&lt;p&gt;另外默认情况下 Redis 会每隔一段时间做一次快照保存在本地磁盘上&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://redis.io/docs/manual/persistence/#snapshotting&quot;&gt;Redis persistence | Redis&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：链接：&lt;a href=&quot;https://pdai.tech/md/db/nosql-redis/db-redis-data-types.html&quot;&gt;Redis入门 - 数据类型：5种基础数据类型详解 | Java 全栈知识体系&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;著作权归&lt;a href=&quot;https://pdai.tech%E6%89%80%E6%9C%89%E3%80%82&quot;&gt;&lt;a href=&quot;https://pdai.tech所有&quot;&gt;https://pdai.tech所有&lt;/a&gt;。&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Redis%E5%85%A5%E9%97%A81.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Redis%E5%85%A5%E9%97%A81.html</guid>
                                               <category>Redis</category>
                                    </item>
                <item>
            <title>Java Thread的一点总结2</title>
            <description>
            &lt;!--
author: admin
date: 2022-08-15
title: Java Thread的一点总结2
tags: 多线程,并发
category: java
status: publish
summary: 写不动了，随便从别的地方抄一点吧
--&gt;
&lt;h1&gt;Java Thread的一点总结2&lt;/h1&gt;
&lt;h3&gt;为什么需要多线程&lt;/h3&gt;
&lt;p&gt;众所周知，CPU、内存、I/O 设备的速度是有极大差异的，为了合理利用 CPU 的高性能，平衡这三者的速度差异，计算机体系结构、操作系统、编译程序都做出了贡献，主要体现为:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU 增加了缓存，以均衡与内存的速度差异；// &lt;strong&gt;导致 &lt;code&gt;可见性&lt;/code&gt;问题&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;操作系统增加了进程、线程，以分时复用 CPU，进而均衡 CPU 与 I/O 设备的速度差异；// &lt;strong&gt;导致 &lt;code&gt;原子性&lt;/code&gt;问题&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;编译程序优化指令执行次序，使得缓存能够得到更加合理地利用。// &lt;strong&gt;导致 &lt;code&gt;有序性&lt;/code&gt;问题&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Life Cycle of a Thread 线程的生命周期&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;index_files/9fe720fd-b9e9-45d8-a9c5-3ed79d04ea96.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一个线程从被创建开始，就会有自己的一个生命周期。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;java.lang.Thread&lt;/code&gt;类包含了一个静态的 &lt;code&gt;State&lt;/code&gt; 枚举，它定义了其潜在的状态。在任何给定的时间点上，线程只能处于这些状态的其中一种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt; 一个新创建但是还未执行的线程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RUNNABLE&lt;/strong&gt; 正在执行或者等待资源分配后准备执行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BLOCKED&lt;/strong&gt; 等待获得 a monitor lock 以进入或者重新进入一个同步块/方法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WAITING&lt;/strong&gt; 在没有任何时间限制的情况下，等待其他线程执行一个特定的动作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TIMED_WAITING&lt;/strong&gt; 等待其他线程在指定时间内执行一个特定的动作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TERMINATED&lt;/strong&gt; 已完成执行&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;RUNNABLE 不代表 CPU 一定在执行该线程的代码，可能正在执行也可能在等待操作系统分配时间片，只是它没有在等待其他条件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;线程使用方式&lt;/h3&gt;
&lt;p&gt;有三种使用线程的方法:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实现 Runnable 接口；&lt;/li&gt;
&lt;li&gt;实现 Callable 接口；&lt;/li&gt;
&lt;li&gt;继承 Thread 类。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务，不是真正意义上的线程，因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。&lt;/p&gt;
&lt;h4&gt;实现 Runnable 接口&lt;/h4&gt;
&lt;p&gt;需要实现 run() 方法。&lt;/p&gt;
&lt;p&gt;通过 Thread 调用 start() 方法来启动线程。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class MyRunnable implements Runnable {
    public void run() {
        // ...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public static void main(String[] args) {
    MyRunnable instance = new MyRunnable();
    Thread thread = new Thread(instance);
    thread.start();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;实现 Callable 接口&lt;/h4&gt;
&lt;p&gt;与 Runnable 相比，Callable 可以有返回值，返回值通过 FutureTask 进行封装。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class MyCallable implements Callable&amp;lt;Integer&amp;gt; {
    public Integer call() {
        return 123;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public static void main(String[] args) throws ExecutionException, InterruptedException {
    MyCallable mc = new MyCallable();
    FutureTask&amp;lt;Integer&amp;gt; ft = new FutureTask&amp;lt;&amp;gt;(mc);
    Thread thread = new Thread(ft);
    thread.start();
    System.out.println(ft.get());
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;继承 Thread 类&lt;/h4&gt;
&lt;p&gt;同样也是需要实现 run() 方法，因为 Thread 类也实现了 Runable 接口。&lt;/p&gt;
&lt;p&gt;当调用 start() 方法启动一个线程时，虚拟机会将该线程放入就绪队列中等待被调度，当一个线程被调度时会执行该线程的 run() 方法。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class MyThread extends Thread {
    public void run() {
        // ...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public static void main(String[] args) {
    MyThread mt = new MyThread();
    mt.start();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;实现接口 VS 继承 Thread&lt;/h4&gt;
&lt;p&gt;实现接口会更好一些，因为:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java 不支持多重继承，因此继承了 Thread 类就无法继承其它类，但是可以实现多个接口；&lt;/li&gt;
&lt;li&gt;类可能只要求可执行就行，继承整个 Thread 类开销过大。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;异步编程&lt;/h3&gt;
&lt;p&gt;随着编写非阻塞代码的需求越来越大，我们需要有办法异步地执行代码。Java中实现异步编程的几种方法和一些提供开箱即用解决方案的Java库。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thread 方式&lt;/li&gt;
&lt;li&gt;FutureTask 方式 - &lt;a href=&quot;https://www.baeldung.com/java-future&quot;&gt;Guide to java.util.concurrent.Future | Baeldung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CompletableFuture 方式 - &lt;a href=&quot;https://www.baeldung.com/java-completablefuture&quot;&gt;Guide To CompletableFuture | Baeldung&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;提供异步功能的开箱即用的 Java 库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Guava&lt;/li&gt;
&lt;li&gt;EA Async&lt;/li&gt;
&lt;li&gt;Cactoos&lt;/li&gt;
&lt;li&gt;Jcabi-Aspects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;完整示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package com.baeldung.async;

import static com.ea.async.Async.await;

import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import com.google.common.util.concurrent.AsyncCallable;
import com.google.common.util.concurrent.Callables;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import com.jcabi.aspects.Async;
import com.jcabi.aspects.Loggable;

public class JavaAsync {

    static {
        com.ea.async.Async.init();
    }

    private static final ExecutorService threadpool = Executors.newCachedThreadPool();

    public static void main (String[] args) throws InterruptedException, ExecutionException {
        int number = 20;

        //Thread Example
        factorialUsingThread(number).start();

        //FutureTask Example
        Future&amp;lt;Long&amp;gt; futureTask = factorialUsingFutureTask(number);
        System.out.println(&quot;Factorial of &quot; + number + &quot; is: &quot; + futureTask.get());

        // CompletableFuture Example
        Future&amp;lt;Long&amp;gt; completableFuture = factorialUsingCompletableFuture(number);
        System.out.println(&quot;Factorial of &quot; + number + &quot; is: &quot; + completableFuture.get());

        // EA Async example
        System.out.println(&quot;Factorial of &quot; + number + &quot; is: &quot; + factorialUsingEAAsync(number));

        // cactoos async example
        Future&amp;lt;Long&amp;gt; asyncFuture = factorialUsingCactoos(number);
        System.out.println(&quot;Factorial of &quot; + number + &quot; is: &quot; + asyncFuture.get());

        // Guava example
        ListenableFuture&amp;lt;Long&amp;gt; guavaFuture = factorialUsingGuavaServiceSubmit(number);
        System.out.println(&quot;Factorial of &quot; + number + &quot; is: &quot; + guavaFuture.get());

        ListenableFuture&amp;lt;Long&amp;gt; guavaFutures = factorialUsingGuavaFutures(number);
        System.out.println(&quot;Factorial of &quot; + number + &quot; is: &quot; + guavaFutures.get());

        // @async jcabi-aspect example
        Future&amp;lt;Long&amp;gt; aspectFuture = factorialUsingJcabiAspect(number);
        System.out.println(&quot;Factorial of &quot; + number + &quot; is: &quot; + aspectFuture.get());

    }

    /**
     * Finds factorial of a number
     * @param number
     * @return
     */
    public static long factorial(int number) {
        long result = 1; 
        for(int i=number;i&amp;gt;0;i--) {
            result *= i; 
        } 
        return result; 
    }

    /**
     * Finds factorial of a number using Thread
     * @param number
     * @return
     */
    @Loggable
    public static Thread factorialUsingThread(int number) {
        Thread newThread = new Thread(() -&amp;gt; {
            System.out.println(&quot;Factorial of &quot; + number + &quot; is: &quot; + factorial(number));
        });

        return newThread;
    }

    /**
     * Finds factorial of a number using FutureTask
     * @param number
     * @return
     */
    @Loggable
    public static Future&amp;lt;Long&amp;gt; factorialUsingFutureTask(int number) {
        Future&amp;lt;Long&amp;gt; futureTask = threadpool.submit(() -&amp;gt; factorial(number)); 

        while (!futureTask.isDone()) { 
            System.out.println(&quot;FutureTask is not finished yet...&quot;); 
        } 

        return futureTask;
    }

    /**
     * Finds factorial of a number using CompletableFuture
     * @param number
     * @return
     */
    @Loggable
    public static Future&amp;lt;Long&amp;gt; factorialUsingCompletableFuture(int number) {
        CompletableFuture&amp;lt;Long&amp;gt; completableFuture = CompletableFuture.supplyAsync(() -&amp;gt; factorial(number));
        return completableFuture;
    }

    /**
     * Finds factorial of a number using EA Async
     * @param number
     * @return
     */
    @Loggable
    public static long factorialUsingEAAsync(int number) {
        CompletableFuture&amp;lt;Long&amp;gt; completableFuture = CompletableFuture.supplyAsync(() -&amp;gt; factorial(number));
        long result = await(completableFuture);
        return result;
    }

    /**
     * Finds factorial of a number using Async of Cactoos
     * @param number
     * @return
     * @throws InterruptedException
     * @throws ExecutionException
     */
    @Loggable
    public static Future&amp;lt;Long&amp;gt; factorialUsingCactoos(int number) throws InterruptedException, ExecutionException {
        org.cactoos.func.Async&amp;lt;Integer, Long&amp;gt; asyncFunction = new org.cactoos.func.Async&amp;lt;Integer, Long&amp;gt;(input -&amp;gt; factorial(input));
        Future&amp;lt;Long&amp;gt; asyncFuture = asyncFunction.apply(number);
        return asyncFuture;
    }

    /**
     * Finds factorial of a number using Guava&#039;s ListeningExecutorService.submit()
     * @param number
     * @return
     */
    @Loggable
    public static ListenableFuture&amp;lt;Long&amp;gt; factorialUsingGuavaServiceSubmit(int number) {
        ListeningExecutorService service = MoreExecutors.listeningDecorator(threadpool);
        ListenableFuture&amp;lt;Long&amp;gt; factorialFuture = (ListenableFuture&amp;lt;Long&amp;gt;) service.submit(()-&amp;gt; factorial(number));
        return factorialFuture;
    }

    /**
     * Finds factorial of a number using Guava&#039;s Futures.submitAsync()
     * @param number
     * @return
     */
    @Loggable
    public static ListenableFuture&amp;lt;Long&amp;gt; factorialUsingGuavaFutures(int number) {
        ListeningExecutorService service = MoreExecutors.listeningDecorator(threadpool);
        AsyncCallable&amp;lt;Long&amp;gt; asyncCallable = Callables.asAsyncCallable(new Callable&amp;lt;Long&amp;gt;() {
            public Long call() {
                return factorial(number);
            }
        }, service);
        return Futures.submitAsync(asyncCallable, service);
    }

    /**
     * Finds factorial of a number using @Async of jcabi-aspects
     * @param number
     * @return
     */
    @Async
    @Loggable
    public static Future&amp;lt;Long&amp;gt; factorialUsingJcabiAspect(int number) {
        Future&amp;lt;Long&amp;gt; factorialFuture = CompletableFuture.supplyAsync(() -&amp;gt; factorial(number));
        return factorialFuture;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pdai.tech/md/java/thread/java-thread-x-thread-basic.html&quot;&gt;Java 并发 - 线程基础 | Java 全栈知识体系 (pdai.tech)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/eugenp/tutorials/blob/master/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/async/JavaAsync.java&quot;&gt;tutorials/JavaAsync.java at master · eugenp/tutorials · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/java-asynchronous-programming&quot;&gt;Asynchronous Programming in Java | Baeldung&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/cs/async-vs-multi-threading&quot;&gt;The Difference Between Asynchronous And Multi-Threading | Baeldung on Computer Science&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/JavaThread%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%BB%E7%BB%932.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/JavaThread%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%BB%E7%BB%932.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Java Thread的一点总结</title>
            <description>
            &lt;!--
author: admin
date: 2022-08-12
title: Java Thread的一点总结
tags: 多线程,并发
category: java
status: publish
summary: 不要随意使用多线程~
--&gt;
&lt;h1&gt;Java Thread的一点总结&lt;/h1&gt;
&lt;p&gt;线程适合处理不能在主线程上运行的长时间任务或者重复任务，或者使用多线程来实现并发。&lt;/p&gt;
&lt;h3&gt;创建线程&lt;/h3&gt;
&lt;p&gt;线程表示一条单独的执行流，它有自己的程序执行计数器，有自己的栈。在 Java 中创建线程有两种方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;继承 Thread 类&lt;/li&gt;
&lt;li&gt;实现 Runnable 接口&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;继承 Thread&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Slf4j
public class SimpleThread extends Thread{

    private final String message;

    public SimpleThread(String message) {
        this.message = message;
    }

    @Override
    public void run() {
        log.info(message);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SimpleThread 继承了 Thread，并重写了 run 方法。 run 方法的方法签名是固定的，public，没有参数，没有返回值，不能抛出异常。run 方法类似单线程程序中的 main 方法，线程从 run 方法的第一条语句开始执行直到结束。&lt;/p&gt;
&lt;p&gt;定义了这个类不代表代码就会开始执行，线程需要被启动，启动需要先创建一个 SimpleThread 对象，然后调用 Thread 的 start 方法&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class SingleThreadExample {
    public static void main(String[] args) {
        SimpleThread simpleThread = new SimpleThread(&quot;Hello World&quot;);
        simpleThread.start();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 main 方法中创建了一个线程对象，并调用了其 start 方法，调用 start 方法后，SimpleThread 的 run 方法就会开始执行。&lt;/p&gt;
&lt;p&gt;实现 Runnable 接口与之类似，这里不再赘述。&lt;/p&gt;
&lt;h3&gt;线程的生命周期&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www.baeldung.com/wp-content/uploads/2018/02/Life_cycle_of_a_Thread_in_Java.jpg&quot; alt=&quot;Life cycle of a Thread in Java&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一个线程从被创建开始，就会有自己的一个生命周期。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;java.lang.Thread&lt;/code&gt;类包含了一个静态的 &lt;code&gt;State&lt;/code&gt; 枚举，它定义了其潜在的状态。在任何给定的时间点上，线程只能处于这些状态的其中一种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt; 一个新创建但是还未执行的线程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RUNNABLE&lt;/strong&gt; 正在执行或者等待资源分配后准备执行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BLOCKED&lt;/strong&gt; 等待获得 a monitor lock 以进入或者重新进入一个同步块/方法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WAITING&lt;/strong&gt; 在没有任何时间限制的情况下，等待其他线程执行一个特定的动作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TIMED_WAITING&lt;/strong&gt; 等待其他线程在指定时间内执行一个特定的动作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TERMINATED&lt;/strong&gt; 已完成执行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RUNNABLE 不代表 CPU 一定在执行该线程的代码，可能正在执行也可能在等待操作系统分配时间片，只是它没有在等待其他条件。&lt;/p&gt;
&lt;h3&gt;多线程同步&lt;/h3&gt;
&lt;p&gt;如果多个线程只关注于自己的任务，那么多线程和单线程程序都差不多，但是如果多线程之间涉及到需要访问同一个对象，那么线程之间就需要同步，以免发生意外的结果。&lt;/p&gt;
&lt;p&gt;监视器（Monitor）是一种同步机制，允许线程之间：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;相互排斥（mutual exclusion）通过锁（locks），在某个时间点上只有一个线程可以执行该方法。&lt;/li&gt;
&lt;li&gt;合作（cooperation）使用 wait-set 机制使线程等待某些条件得到满足的能力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为什么被叫做 monitor 呢？Because &lt;strong&gt;it monitors how threads access some resources.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;监视器提供三个主要功能给并发程序：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;only one thread at a time has mutually exclusive access to a critical code section&lt;/li&gt;
&lt;li&gt;threads running in a monitor could be blocked while they’re waiting for certain conditions to be met&lt;/li&gt;
&lt;li&gt;one thread can notify other threads when conditions they’re waiting on are met&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Java 实现 Monitors&lt;/h4&gt;
&lt;p&gt;关键部分（critical section）是指被不同的线程访问的相同数据的代码区域。&lt;/p&gt;
&lt;p&gt;在 java 中，使用 &lt;code&gt;synchronized&lt;/code&gt; 关键词标记关键部分（critical sections）&lt;/p&gt;
&lt;p&gt;synchronized 可以标记类的实例方法，此时 synchronized 保护的是当前实例对象（this）。&lt;/p&gt;
&lt;p&gt;synchronized 可以标记类的静态方法，此时 synchronized 保护的是类对象本身。&lt;/p&gt;
&lt;p&gt;synchronized 也可以只标记一部分代码（synchronized statements）。&lt;/p&gt;
&lt;h4&gt;java 实现监视器的类比&lt;/h4&gt;
&lt;p&gt;直接放原文：&lt;/p&gt;
&lt;p&gt;Java’s implementation of a monitor mechanism relies on two concepts – the &lt;em&gt;entry set&lt;/em&gt; and the &lt;em&gt;wait set&lt;/em&gt;. In literature, authors use a building and exclusive room analogy to represent the monitor mechanism. In this analogy, only one person can be present in an exclusive room at a time.&lt;/p&gt;
&lt;p&gt;So, in this analogy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the monitor is a building that contains two rooms and a hallway&lt;/li&gt;
&lt;li&gt;the synchronized resource is the “exclusive room”&lt;/li&gt;
&lt;li&gt;&lt;em&gt;wait set&lt;/em&gt; is a “waiting room”&lt;/li&gt;
&lt;li&gt;&lt;em&gt;entry set&lt;/em&gt; is a “hallway”&lt;/li&gt;
&lt;li&gt;threads are people who want to get to the exclusive room&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://www.baeldung.com/wp-content/uploads/sites/4/2020/05/MonitorsAnalogy.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;When the person wants to enter the exclusive room, he first goes to the hallway (the &lt;em&gt;entry set&lt;/em&gt;) where he waits for a scheduler. Therefore, the scheduler will pick the person and send him to the exclusive room.&lt;/p&gt;
&lt;p&gt;Schedulers in JVMs use a priority-based scheduling algorithm. In case two threads have the same priority, the JVM uses the FIFO approach.&lt;/p&gt;
&lt;p&gt;Hence, when the scheduler picks the person, he enters the exclusive room. It could be that some specific situation is happening in this room, so that person needs to go out and wait for the exclusive room to become available again. Therefore, that person will end up in the waiting room (the &lt;em&gt;wait set&lt;/em&gt;). Consequently, the scheduler will schedule this person to enter an exclusive room later.&lt;/p&gt;
&lt;p&gt;Also, it’s important to mention the steps that threads go through during this process, using the same analogy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;entering the building – entering the monitor&lt;/li&gt;
&lt;li&gt;entering the exclusive room – acquiring the monitor&lt;/li&gt;
&lt;li&gt;being in the exclusive room – owning the monitor&lt;/li&gt;
&lt;li&gt;leaving the exclusive room – releasing the monitor&lt;/li&gt;
&lt;li&gt;leaving the building – exiting the monitor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Luckily, Java does most of the work in the background, and we don’t need to write semaphores when we’re dealing with multi-threaded applications. Therefore, the only thing we need to do is wrap our critical section with the &lt;em&gt;synchronized&lt;/em&gt; keywords and it momentarily becomes a monitor region &lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;synchronized 实现的是监视器的相互排斥特性，wait/notify 则是实现监视器的合作特性。&lt;/p&gt;
&lt;h4&gt;线程同步（合作）&lt;/h4&gt;
&lt;p&gt;Java 的根父类是 Object，Java 在 Object 类而非 Thread 类中定义了一些线程协作的基本方法，使得每个对象都可以调用这些方法，这些方法有两类，一类是 wait，另一类是 notify 。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public final void wait() throws InterruptedException
public final native void wait(long timeout) throws InterruptedException;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;wait 实际上做了什么呢？它在等待什么？每个对象都有一把锁和等待队列，一个线程在进入 synchronized 代码块时，会尝试获取锁，如果获取不到则会把当前线程加入到等待队列中，除了用于锁的等待队列，每个对象还有另一个等待队列，表示条件队列，该队列用于线程间的协作。调用 wait 就会把当前线程放到条件队列上并阻塞，表示当前线程执行不下去了，它需要等待一个条件，这条件它自己改变不了，需要其他线程改变。当其他线程改变了条件后，应该调用 Object 的 notify 方法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public final native void notify();
public final native void notifyAll();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;notify 做的事情是从条件队列中选一个线程，将其从队列中移除并唤醒，notifyAll 是移除条件队列中的所有线程并全部唤醒。&lt;/p&gt;
&lt;p&gt;其实 Thread 类中也有使线程等待一段时间的静态方法 &lt;code&gt;sleep()&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sleep&lt;/code&gt;和&lt;code&gt;wait&lt;/code&gt;都会使线程 &lt;strong&gt;TIMED_WAITING&lt;/strong&gt; ，但是 wait 会让线程释放对象锁，而 &lt;code&gt;sleep&lt;/code&gt; 不会释放对象锁。&lt;/p&gt;
&lt;p&gt;另外 wait/notify 方法只能在 synchronized 代码块内被调用，如果调用 wait/notify 时，当前线程没有持有对象锁，则会抛出 &lt;code&gt;java.lang.IllegalMonitor-StateException&lt;/code&gt; 异常。&lt;/p&gt;
&lt;h3&gt;Executors 线程池&lt;/h3&gt;
&lt;h4&gt;类结构关系&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;index_files/afa5c453-7e66-4702-bdb9-eb50d7b1f044.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Executor 接口&lt;/h4&gt;
&lt;p&gt;Executor 管理多个异步任务的执行，而无需程序员显式地管理线程的生命周期。这里的异步是指多个任务的执行互不干扰，不需要进行同步操作。&lt;/p&gt;
&lt;h4&gt;ExecutorService 框架&lt;/h4&gt;
&lt;p&gt;ExecutorService 实现了线程池（Thread Pool）设计模式（也称为复制的工作者或工作者-团队模式），并负责我们上面提到的线程管理，此外它还增加了一些非常有用的功能，如线程可重用性和任务队列。&lt;/p&gt;
&lt;p&gt;ExecutorService 继承自 Executor 接口，ExecutorService 提供了管理终止的方法，以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以关闭 ExecutorService，这将导致其停止接受新任务。关闭后，执行程序将最后终止，这时没有任务在执行，也没有任务在等待执行，并且无法提交新任务。&lt;/p&gt;
&lt;h4&gt;ScheduledExecutorService 接口&lt;/h4&gt;
&lt;p&gt;ScheduledExecutorService继承自ExecutorService接口，可安排在给定的延迟后运行或定期执行的命令。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/java-start-thread&quot;&gt;How to Start a Thread in Java | Baeldung&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/java-thread-lifecycle&quot;&gt;Life Cycle of a Thread in Java | Baeldung&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/java-synchronized&quot;&gt;Guide to the Synchronized Keyword in Java | Baeldung&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/java-wait-notify&quot;&gt;wait and notify() Methods in Java | Baeldung&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/java-executor-service-tutorial&quot;&gt;A Guide to the Java ExecutorService | Baeldung&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/cs/monitor&quot;&gt;What is a Monitor in Computer Science? | Baeldung on Computer Science&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;《Java 编程的逻辑》第五部分&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pdai.tech/md/java/thread/java-thread-x-juc-overview.html&quot;&gt;JUC - 类汇总和学习指南 | Java 全栈知识体系 (pdai.tech)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/JavaThread%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%BB%E7%BB%93.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/JavaThread%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%BB%E7%BB%93.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring BlockingQueue 另一种生产者消费者问题</title>
            <description>
            &lt;!--
author: admin
date: 2022-08-07
title: Spring BlockingQueue 另一种生产者消费者问题
tags: Spring,Websocket,STOMP,BlockingQueue,线程安全
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring BlockingQueue 另一种生产者消费者问题&lt;/h1&gt;
&lt;p&gt;前提：&lt;/p&gt;
&lt;p&gt;我使用了 Spring + Websocket + Stomp 的方式在页面上显示内容。后端产生内容，放入到一个 BlockingQueue 中，当浏览器打开相应页面时，显示内容，当浏览器关闭页面时，不显示内容，但是后端还是会继续产生并放入队列。&lt;/p&gt;
&lt;p&gt;配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
@EnableWebSocketMessageBroker
@EnableAsync
public class WebsocketConfiguration implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker(&quot;/topic&quot;);
        config.setApplicationDestinationPrefixes(&quot;/app&quot;);
    }
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint(&quot;/stock-ticks&quot;).withSockJS();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
public class MyQueueConfiguration {
    @Bean(name = &quot;saveProductQueue&quot;)
    public BlockingQueue&amp;lt;String&amp;gt; saveProductQueue() {
        return new LinkedBlockingQueue&amp;lt;&amp;gt;();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Controller&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Controller
public class StockTicksController {
    @Autowired
    private ProducerService producerService;

    @GetMapping(&quot;/&quot;)
    public String index() {
        producerService.sendTicks();
        return &quot;index&quot;;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ProducerService&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Service
public class ProducerService {

    @Resource
    private BlockingQueue&amp;lt;String&amp;gt; saveProductQueue;
    @Async
    @SneakyThrows
    public void sendTicks() {
        while (true) {
            saveProductQueue.add(getStockTicks());
            System.out.println(saveProductQueue);
            TimeUnit.SECONDS.sleep(5);
        }
    }
    private String getStockTicks() {
        String time = new SimpleDateFormat(&quot;HH:mm:ss&quot;).format(new Date());
        return &quot;Hello, World: &quot; + time;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生产者每5秒将 Hello, World 和 当前时间写入到队列，并且打印出队列&lt;/p&gt;
&lt;p&gt;ConsumerService&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Service
public class ConsumerService {
    private final TaskScheduler taskScheduler;
    private ScheduledFuture&amp;lt;?&amp;gt; yourTaskState;
    private final SimpMessagingTemplate simpMessagingTemplate;
    @Resource
    private BlockingQueue&amp;lt;String&amp;gt; saveProductQueue;
    @Autowired
    public ConsumerService(TaskScheduler taskScheduler,  SimpMessagingTemplate simpMessagingTemplate) {
        this.taskScheduler = taskScheduler;
        this.simpMessagingTemplate = simpMessagingTemplate;
    }
    class ScheduledTaskExecutor implements Runnable{
        @Override
        public void run() {
            while (!saveProductQueue.isEmpty())
            simpMessagingTemplate.convertAndSend(&quot;/topic/ticks&quot;, saveProductQueue.poll());
        }
    }
    public void start(){
        long fixedRate = 1000L;
        yourTaskState = taskScheduler.scheduleAtFixedRate(new ScheduledTaskExecutor(), fixedRate);
    }
    public void stop(){
        yourTaskState.cancel(true);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;消费者将队列中的消息取出然后发送出去&lt;/p&gt;
&lt;p&gt;因为要实现打开页面后开始发送消息，关闭页面后停止发送，所以使用了事件监听：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Component
public class ConnectListenerEvent implements ApplicationListener&amp;lt;SessionConnectedEvent&amp;gt; {

    @Autowired
    private ConsumerService consumerService;

    @Override
    public void onApplicationEvent(SessionConnectedEvent sessionConnectedEvent) {
        consumerService.start();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当连接上时开始消费者服务&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Component
public class DisconnectListenerEvent implements ApplicationListener&amp;lt;SessionDisconnectEvent&amp;gt; {
    @Autowired
    private ConsumerService consumerService;

    @Override
    public void onApplicationEvent(SessionDisconnectEvent sessionDisconnectEvent) {
        consumerService.stop();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当断开时停止消费者服务&lt;/p&gt;
&lt;p&gt;html页面&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;  &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    var stompClient = null;

    function connect() {
      var socket = new SockJS(&#039;/stock-ticks&#039;);
      stompClient = Stomp.over(socket);
      stompClient.connect({}, function(frame) {
        console.log(&#039;Connected: &#039; + frame);
        stompClient.subscribe(&#039;/topic/ticks&#039;, function(ticks) {
          showProcessMessage(ticks);
        });
      });
    }

    function showProcessMessage(processMessage) {
      let response = document.getElementById(&#039;response&#039;);
      let p = document.createElement(&quot;p&quot;);
      p.style.wordBreak = &quot;break-word&quot;;
      p.appendChild(document.createTextNode(processMessage.body));
      response.appendChild(p);
    }

    function disconnect() {
      if(stompClient != null) {
        stompClient.disconnect();
      }
      console.log(&quot;Disconnected&quot;);
    }

  &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在遇到的问题是&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e9553fb0-3026-405b-bc93-890f0b09de73.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;更新：&lt;/p&gt;
&lt;p&gt;其实问题在于&lt;code&gt;simpMessagingTemplate.convertAndSend(&quot;/topic/ticks&quot;, saveProductQueue.poll());&lt;/code&gt;，当发送批量数据的时候要加上延时，可能短时间内一次性发送数据的时候 &lt;code&gt;STOMP&lt;/code&gt; 协议没处理好，导致粘包了。&lt;code&gt;BlockingQueue&lt;/code&gt;队列里面还是有之前的数据的，只是前端页面没显示出来。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Spring-BlockingQueue-%E5%8F%A6%E4%B8%80%E7%A7%8D%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%97%AE%E9%A2%98.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Spring-BlockingQueue-%E5%8F%A6%E4%B8%80%E7%A7%8D%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%97%AE%E9%A2%98.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Springboot + Bootstrap + Thymeleaf 分页</title>
            <description>
            &lt;!--
author: admin
date: 2022-07-25
title: Springboot + Bootstrap + Thymeleaf 分页
tags: Spring,Thymeleaf,Bootstrap,分页
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Springboot + Bootstrap + Thymeleaf 分页&lt;/h1&gt;
&lt;h3&gt;前言&lt;/h3&gt;
&lt;p&gt;这里需要使用到的组件有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Springboot 2.7.x&lt;/li&gt;
&lt;li&gt;MySQL 5.7.x&lt;/li&gt;
&lt;li&gt;Mybatis Plus 3.5.2&lt;/li&gt;
&lt;li&gt;Bootstrap 4.5.x&lt;/li&gt;
&lt;li&gt;Thymeleaf&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;添加依赖和配置 application.properties&lt;/h3&gt;
&lt;h4&gt;依赖&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-thymeleaf&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;3.5.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt;
    &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
    &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;
    &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-configuration-processor&amp;lt;/artifactId&amp;gt;
    &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;
    &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt;
    &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;配置 application.properties&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;# Thymeleaf Configuration
# 关闭缓存
spring.thymeleaf.cache=false
# 字符编码
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.mode=HTML
# 模板文件位置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

# MySQL Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/dong?serverTimezone=UTC&amp;amp;characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root#admin

# HikariCP Configuration
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1

# Tomcat Port
server.port=18443
server.address=localhost&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Model，View，Controller layers&lt;/h3&gt;
&lt;p&gt;在数据层，先创建一个简单的实体类&lt;code&gt;Post&lt;/code&gt;，包含&lt;code&gt;title&lt;/code&gt;和&lt;code&gt;body&lt;/code&gt;字段&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

@Data
public class Post {
    @TableId
    private Long id;
    private String title;
    private String body;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在数据访问层(&lt;code&gt;PostDao&lt;/code&gt;)，直接使用 &lt;code&gt;Mybatisplus&lt;/code&gt;提供的 API&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.syuez.dong.entity.Post;

public interface PostDAO extends BaseMapper&amp;lt;Post&amp;gt; {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在服务层，&lt;code&gt;PostService&lt;/code&gt;类负责查询数据，并将结果与&lt;code&gt;Paged&lt;/code&gt;实例打包&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.syuez.dong.entity.Paged;
import com.syuez.dong.entity.Paging;
import com.syuez.dong.entity.Post;
import com.syuez.dong.mapper.PostDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class PostService {

    private final PostDAO postDAO;

    @Autowired
    public PostService(PostDAO postDAO) {
        this.postDAO = postDAO;
    }

    public Paged&amp;lt;Post&amp;gt; getPage(int pageNumber, int size) {
        Page&amp;lt;Post&amp;gt; page = new Page&amp;lt;&amp;gt;(pageNumber, size);
        postDAO.selectPage(page, null);
        /*
          总页数 = 总条目数÷每页显示目数，如果整除则取商，如果有余数则取（商+1）
         */
        int totalPages = (int) page.getTotal() % size == 0 ? (int) page.getTotal() / size : (int) page.getTotal() / size + 1;
        return new Paged&amp;lt;&amp;gt;(page, Paging.of(totalPages, pageNumber,size));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Paged&lt;/code&gt;，&lt;code&gt;PageItem&lt;/code&gt;，&lt;code&gt;PageItemType&lt;/code&gt;和&lt;code&gt;Paging&lt;/code&gt;类是用于准备分页组件的工具类&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Paged&lt;/code&gt;类结构&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Getter;
public class Paged&amp;lt;T&amp;gt; {
    @Getter
    private final Page&amp;lt;T&amp;gt; page;    
    @Getter
    private final Paging paging;

    public Paged(Page&amp;lt;T&amp;gt; page, Paging paging) {
        this.page = page;
        this.paging = paging;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;PageItem&lt;/code&gt;类结构&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class PageItem {

    private PageItemType pageItemType;
    /**
     * 当前索引
     */
    private int index;
    /**
     * 是否激活
     */
    private boolean active;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;PageItemType&lt;/code&gt;结构&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 分页类型
 */
public enum PageItemType {
    /**
     * 省略号
     */
    DOTS,
    /**
     * 页面
     */
    PAGE
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Paging&lt;/code&gt;类负责计算如何在分页组件中显示页面和&lt;code&gt;...&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;
public class Paging {

    private static final int PAGINATION_STEP = 3;
    /**
     * 是否存在下一页
     */
    @Setter
    @Getter
    private boolean nextEnabled;
    /**
     * 是否存在上一页
     */
    @Setter
    @Getter
    private boolean prevEnabled;
    /**
     * 每页显示多少数据
     */
    @Setter
    @Getter
    private int pageSize;
    /**
     * 当前是第几页
     */
    @Setter
    @Getter
    private int pageNumber;
    /**
     * 分页列表
     */    
    @Getter
    private List&amp;lt;PageItem&amp;gt; items = new ArrayList&amp;lt;&amp;gt;();

    public void addPageItems(int from, int to, int pageNumber) {
        for (int i = from; i &amp;lt; to; i++) {
            items.add(PageItem.builder()
                    .active(pageNumber !=i)
                    .index(i)
                    .pageItemType(PageItemType.PAGE)
                    .build());
        }
    }

    public void lastPage(int pageSize) {
        items.add(PageItem.builder()
                .active(false)
                .pageItemType(PageItemType.DOTS)
                .build());

        items.add(PageItem.builder()
                .active(true)
                .index(pageSize)
                .pageItemType(PageItemType.PAGE)
                .build());
    }

    public void firstPage(int pageNumber) {
        items.add(PageItem.builder()
                .active(pageNumber != 1)
                .index(1)
                .pageItemType(PageItemType.PAGE)
                .build());

        items.add(PageItem.builder()
                .active(false)
                .pageItemType(PageItemType.DOTS)
                .build());
    }

    public static Paging of(int totalPages, int pageNumber, int pageSize) {
        Paging paging = new Paging();
        // 设置每页显示条目
        paging.setPageSize(pageSize);
        // 当前页不是总页数时，总有下一页
        paging.setNextEnabled(pageNumber != totalPages);
        // 当前页不是第一页时，总有上一页
        paging.setPrevEnabled(pageNumber != 1);
        // 设置当前页
        paging.setPageNumber(pageNumber);
        // 分页逻辑
        if (totalPages &amp;lt; PAGINATION_STEP * 2 + 6) {
            paging.addPageItems(1, totalPages + 1, pageNumber);
        } else if (pageNumber &amp;lt; PAGINATION_STEP * 2 + 1) {
            paging.addPageItems(1, PAGINATION_STEP * 2 + 4, pageNumber);
            paging.lastPage(totalPages);

        } else if (pageNumber &amp;gt; totalPages - PAGINATION_STEP * 2) {
            paging.firstPage(pageNumber);
            paging.addPageItems(totalPages - PAGINATION_STEP * 2 - 2, totalPages + 1, pageNumber);

        } else {
            paging.firstPage(pageNumber);
            paging.addPageItems(pageNumber - PAGINATION_STEP, pageNumber + PAGINATION_STEP + 1, pageNumber);
            paging.lastPage(totalPages);
        }

        return paging;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GET 请求是由&lt;code&gt;PostController&lt;/code&gt;类处理的。为了改变当前页面和页面显示的条目数量，我们需要添加两个请求参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pageNumber - 当前的页面(默认是第一页)&lt;/li&gt;
&lt;li&gt;size - 每页显示条目数(默认是5行)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.syuez.dong.service.PostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.ui.Model;

@Controller
@RequestMapping(&quot;/&quot;)
public class PostController {
    private final PostService postService;

    @Autowired
    public PostController(PostService postService) {
        this.postService = postService;
    }

    @GetMapping
    public String posts(@RequestParam(value = &quot;pageNumber&quot;, required = false, defaultValue = &quot;1&quot;) int pageNumber,
                        @RequestParam(value = &quot;size&quot;, required = false, defaultValue = &quot;5&quot;) int size, Model model) {
        model.addAttribute(&quot;posts&quot;, postService.getPage(pageNumber, size));
        return &quot;posts&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置 MybatisPlush 的分页&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan(&quot;com.syuez.dong.mapper&quot;)
public class MybatisPlusConfig {
    /**
     * 新的分页插件,分页插件，如果你不配置，分页插件将不生效,指定数据库方言为 MYSQL
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        // 单页分页条数限制
        pageInterceptor.setMaxLimit(20L);
        interceptor.addInnerInterceptor(pageInterceptor);
        return interceptor;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Thymeleaf 模板&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;posts.html&lt;/code&gt;源码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;zh&quot; xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;!-- Required meta tags --&amp;gt;
  &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html&quot; charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1, shrink-to-fit=no&quot;&amp;gt;
  &amp;lt;!-- Bootstrap CSS --&amp;gt;
  &amp;lt;link type=&quot;text/css&quot; th:href=&quot;@{css/bootstrap4/bootstrap.min.css}&quot; rel=&quot;stylesheet&quot;&amp;gt;
  &amp;lt;title&amp;gt;狗屁不通文章&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container-fluid&quot;&amp;gt;
  &amp;lt;!-- Navigation --&amp;gt;
  &amp;lt;nav class=&quot;navbar navbar-expand-lg navbar-dark bg-dark static-top&quot;&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
      &amp;lt;a class=&quot;navbar-brand&quot; href=&quot;/&quot;&amp;gt;Thymeleaf - Bootstrap Pagination&amp;lt;/a&amp;gt;
      &amp;lt;button class=&quot;navbar-toggler&quot; type=&quot;button&quot; data-toggle=&quot;collapse&quot; data-target=&quot;#navbarResponsive&quot;
              aria-controls=&quot;navbarResponsive&quot;
              aria-expanded=&quot;false&quot; aria-label=&quot;Toggle navigation&quot;&amp;gt;
        &amp;lt;span class=&quot;navbar-toggler-icon&quot;&amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;/button&amp;gt;
      &amp;lt;div class=&quot;collapse navbar-collapse&quot; id=&quot;navbarResponsive&quot;&amp;gt;
        &amp;lt;ul class=&quot;navbar-nav ml-auto&quot;&amp;gt;
          &amp;lt;li class=&quot;nav-item active&quot;&amp;gt;
            &amp;lt;a class=&quot;nav-link&quot; href=&quot;#&quot;&amp;gt;Home
              &amp;lt;span class=&quot;sr-only&quot;&amp;gt;(current)&amp;lt;/span&amp;gt;
            &amp;lt;/a&amp;gt;
          &amp;lt;/li&amp;gt;
          &amp;lt;li class=&quot;nav-item&quot;&amp;gt;
            &amp;lt;a class=&quot;nav-link&quot; href=&quot;#&quot;&amp;gt;About&amp;lt;/a&amp;gt;
          &amp;lt;/li&amp;gt;
          &amp;lt;li class=&quot;nav-item&quot;&amp;gt;
            &amp;lt;a class=&quot;nav-link&quot; href=&quot;#&quot;&amp;gt;Services&amp;lt;/a&amp;gt;
          &amp;lt;/li&amp;gt;
          &amp;lt;li class=&quot;nav-item&quot;&amp;gt;
            &amp;lt;a class=&quot;nav-link&quot; href=&quot;#&quot;&amp;gt;Contact&amp;lt;/a&amp;gt;
          &amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/nav&amp;gt;

  &amp;lt;div class=&quot;container&quot;&amp;gt;
    &amp;lt;div class=&quot;row&quot;&amp;gt;
      &amp;lt;div class=&quot;col-lg-10 mt-5 mb-5&quot;&amp;gt;
        &amp;lt;table id=&quot;posts&quot; class=&quot;table table-bordered table-responsive-sm&quot;&amp;gt;
          &amp;lt;thead&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Title&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Body&amp;lt;/th&amp;gt;
          &amp;lt;/tr&amp;gt;
          &amp;lt;/thead&amp;gt;
          &amp;lt;tbody&amp;gt;
          &amp;lt;tr th:each=&quot;post : ${posts.page.getRecords()}&quot;&amp;gt;
            &amp;lt;td th:text=&quot;${post.id}&quot;&amp;gt;id&amp;lt;/td&amp;gt;
            &amp;lt;td th:text=&quot;${post.title}&quot;&amp;gt;title&amp;lt;/td&amp;gt;
            &amp;lt;td th:text=&quot;${post.body}&quot;&amp;gt;body&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
          &amp;lt;/tbody&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;nav aria-label=&quot;Page navigation&quot; class=&quot;paging&quot;&amp;gt;
          &amp;lt;ul class=&quot;pagination&quot; th:if=&quot;${posts.page.getTotal() &amp;gt; 1}&quot;&amp;gt;
            &amp;lt;li class=&quot;page-item&quot; th:classappend=&quot;${!posts.paging.isPrevEnabled()? &#039;disabled&#039; : &#039;&#039;}&quot;&amp;gt;
              &amp;lt;a class=&quot;page-link&quot; th:href=&quot;@{&#039;/?pageNumber=&#039; + ${posts.paging.pageNumber - 1}}&quot;
                 tabindex=&quot;-1&quot;&amp;gt;上一页&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
            &amp;lt;th:block th:each=&quot;item : ${posts.paging.getItems()}&quot;&amp;gt;
              &amp;lt;li class=&quot;page-item&quot; th:classappend=&quot;${item.index == posts.paging.pageNumber? &#039;active&#039; : &#039;&#039;}&quot;
                  th:if=&quot;${item.pageItemType.name() == &#039;PAGE&#039;}&quot;&amp;gt;
                &amp;lt;a class=&quot;page-link&quot; th:href=&quot;@{&#039;/?pageNumber=&#039; + ${item.index}}&quot;
                   th:text=&quot;${item.index}&quot;&amp;gt;&amp;lt;/a&amp;gt;
              &amp;lt;/li&amp;gt;
              &amp;lt;li class=&quot;page-item disabled&quot; th:if=&quot;${item.pageItemType.name() == &#039;DOTS&#039;}&quot;&amp;gt;
                &amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot;&amp;gt;...&amp;lt;/a&amp;gt;
              &amp;lt;/li&amp;gt;
            &amp;lt;/th:block&amp;gt;
            &amp;lt;li class=&quot;page-item&quot; th:classappend=&quot;${!posts.paging.isNextEnabled()? &#039;disabled&#039; : &#039;&#039;}&quot;&amp;gt;
              &amp;lt;a class=&quot;page-link&quot; th:href=&quot;@{&#039;/?pageNumber=&#039; + ${posts.paging.pageNumber + 1}}&quot;&amp;gt;下一页&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
          &amp;lt;/ul&amp;gt;
        &amp;lt;/nav&amp;gt;

      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;!-- jQuery first, then Popper.js and Bootstrap JS --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; th:src=&quot;@{js/jquery/jquery-3.6.0.min.js}&quot; &amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; th:src=&quot;@{js/bootstrapjs/bootstrap.bundle.min.js}&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;效果&lt;/h3&gt;
&lt;p&gt;请访问 &lt;a href=&quot;https://dong.syuez.com&quot;&gt;https://dong.syuez.com&lt;/a&gt; 查看效果&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：&lt;a href=&quot;https://frontbackend.com/thymeleaf/spring-boot-bootstrap-thymeleaf-pagination-jpa-liquibase-h2&quot;&gt;Spring Boot + Bootstrap + Thymeleaf Pagination (JPA, Liquibase, H2) | FrontBackend&lt;/a&gt; 代码有略微修改。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Springboot_Bootstrap_Thymeleaf_%E5%88%86%E9%A1%B5.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Springboot_Bootstrap_Thymeleaf_%E5%88%86%E9%A1%B5.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring&Spring Boot 常用注解总结！</title>
            <description>
            &lt;!--
author: Guide 哥
date: 2022-07-06
title: Spring&amp;Spring Boot 常用注解总结！
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring&amp;amp;Spring Boot 常用注解总结！&lt;/h1&gt;
&lt;h3&gt;&lt;code&gt;@SpringBootApplication&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;这里先单独拎出&lt;code&gt;@SpringBootApplication&lt;/code&gt; 注解说一下，虽然我们一般不会主动去使用它。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这个注解是 Spring Boot 项目的基石，创建 SpringBoot 项目之后会默认在主类加上。&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@SpringBootApplication
public class SpringSecurityJwtGuideApplication {
      public static void main(java.lang.String[] args) {
        SpringApplication.run(SpringSecurityJwtGuideApplication.class, args);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以把 &lt;code&gt;@SpringBootApplication&lt;/code&gt;看作是 &lt;code&gt;@Configuration&lt;/code&gt;、&lt;code&gt;@EnableAutoConfiguration&lt;/code&gt;、&lt;code&gt;@ComponentScan&lt;/code&gt; 注解的集合。&lt;/p&gt;
&lt;p&gt;根据 SpringBoot 官网，这三个注解的作用分别是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@EnableAutoConfiguration&lt;/code&gt;：启用 SpringBoot 的自动配置机制&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ComponentScan&lt;/code&gt;： 扫描被&lt;code&gt;@Component&lt;/code&gt; (&lt;code&gt;@Repository&lt;/code&gt;,&lt;code&gt;@Service&lt;/code&gt;,&lt;code&gt;@Controller&lt;/code&gt;)注解的 bean，注解默认会扫描该类所在的包下所有的类。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Configuration&lt;/code&gt;：允许在 Spring 上下文中注册额外的 bean 或导入其他配置类&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Spring Bean 相关&lt;/h3&gt;
&lt;h4&gt;&lt;code&gt;@Autowired&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;自动导入对象到类中，被注入进的类同样要被 Spring 容器管理比如：Service 类注入到 Controller 类中。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Service
public class UserService {
  ......
}

@RestController
@RequestMapping(&quot;/users&quot;)
public class UserController {
   @Autowired
   private UserService userService;
   ......
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;@Component&lt;/code&gt;,&lt;code&gt;@Repository&lt;/code&gt;,&lt;code&gt;@Service&lt;/code&gt;, &lt;code&gt;@Controller&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;我们一般使用 &lt;code&gt;@Autowired&lt;/code&gt; 注解让 Spring 容器帮我们自动装配 bean。要想把类标识成可用于 &lt;code&gt;@Autowired&lt;/code&gt; 注解自动装配的 bean 的类,可以采用以下注解实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Component&lt;/code&gt; ：通用的注解，可标注任意类为 &lt;code&gt;Spring&lt;/code&gt; 组件。如果一个 Bean 不知道属于哪个层，可以使用&lt;code&gt;@Component&lt;/code&gt; 注解标注。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Repository&lt;/code&gt; : 对应持久层即 Dao 层，主要用于数据库相关操作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Service&lt;/code&gt; : 对应服务层，主要涉及一些复杂的逻辑，需要用到 Dao 层。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Controller&lt;/code&gt; : 对应 Spring MVC 控制层，主要用于接受用户请求并调用 Service 层返回数据给前端页面。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;code&gt;@RestController&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@RestController&lt;/code&gt;注解是&lt;code&gt;@Controller&lt;/code&gt;和&lt;code&gt;@ResponseBody&lt;/code&gt;的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,是 REST 风格的控制器。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;现在都是前后端分离，说实话我已经很久没有用过&lt;code&gt;@Controller&lt;/code&gt;。如果你的项目太老了的话，就当我没说。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;单独使用 &lt;code&gt;@Controller&lt;/code&gt; 不加 &lt;code&gt;@ResponseBody&lt;/code&gt;的话一般是用在要返回一个视图的情况，这种情况属于比较传统的 Spring MVC 的应用，对应于前后端不分离的情况。&lt;code&gt;@Controller&lt;/code&gt; +&lt;code&gt;@ResponseBody&lt;/code&gt; 返回 JSON 或 XML 形式数据。&lt;/p&gt;
&lt;p&gt;关于&lt;code&gt;@RestController&lt;/code&gt; 和 &lt;code&gt;@Controller&lt;/code&gt;的对比，请看这篇文章：&lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&amp;amp;mid=2247485544&amp;amp;idx=1&amp;amp;sn=3cc95b88979e28fe3bfe539eb421c6d8&amp;amp;chksm=cea247a3f9d5ceb5e324ff4b8697adc3e828ecf71a3468445e70221cce768d1e722085359907&amp;amp;token=1725092312&amp;amp;lang=zh_CN#rd&quot;&gt;@RestController vs @Controller&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;@Scope&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;声明 Spring Bean 的作用域，使用方法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Bean
@Scope(&quot;singleton&quot;)
public Person personSingleton() {
    return new Person();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;四种常见的 Spring Bean 的作用域：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;singleton : 唯一 bean 实例，Spring 中的 bean 默认都是单例的。&lt;/li&gt;
&lt;li&gt;prototype : 每次请求都会创建一个新的 bean 实例。&lt;/li&gt;
&lt;li&gt;request : 每一次 HTTP 请求都会产生一个新的 bean，该 bean 仅在当前 HTTP request 内有效。&lt;/li&gt;
&lt;li&gt;session : 每一个 HTTP Session 会产生一个新的 bean，该 bean 仅在当前 HTTP session 内有效。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;code&gt;@Configuration&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;一般用来声明配置类，可以使用 &lt;code&gt;@Component&lt;/code&gt;注解替代，不过使用&lt;code&gt;@Configuration&lt;/code&gt;注解声明配置类更加语义化。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;处理常见的 HTTP 请求类型&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;5 种常见的请求类型:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GET&lt;/strong&gt; ：请求从服务器获取特定资源。举个例子：&lt;code&gt;GET /users&lt;/code&gt;（获取所有学生）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;POST&lt;/strong&gt; ：在服务器上创建一个新的资源。举个例子：&lt;code&gt;POST /users&lt;/code&gt;（创建学生）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PUT&lt;/strong&gt; ：更新服务器上的资源（客户端提供更新后的整个资源）。举个例子：&lt;code&gt;PUT /users/12&lt;/code&gt;（更新编号为 12 的学生）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DELETE&lt;/strong&gt; ：从服务器删除特定的资源。举个例子：&lt;code&gt;DELETE /users/12&lt;/code&gt;（删除编号为 12 的学生）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PATCH&lt;/strong&gt; ：更新服务器上的资源（客户端提供更改的属性，可以看做作是部分更新），使用的比较少，这里就不举例子了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;GET 请求&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@GetMapping(&quot;users&quot;)&lt;/code&gt; 等价于&lt;code&gt;@RequestMapping(value=&quot;/users&quot;,method=RequestMethod.GET)&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@GetMapping(&quot;/users&quot;)
public ResponseEntity&amp;lt;List&amp;lt;User&amp;gt;&amp;gt; getAllUsers() {
 return userRepository.findAll();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;POST 请求&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@PostMapping(&quot;users&quot;)&lt;/code&gt; 等价于&lt;code&gt;@RequestMapping(value=&quot;/users&quot;,method=RequestMethod.POST)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;关于&lt;code&gt;@RequestBody&lt;/code&gt;注解的使用，在下面的“前后端传值”这块会讲到。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@PostMapping(&quot;/users&quot;)
public ResponseEntity&amp;lt;User&amp;gt; createUser(@Valid @RequestBody UserCreateRequest userCreateRequest) {
 return userRespository.save(userCreateRequest);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;PUT 请求&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@PutMapping(&quot;/users/{userId}&quot;)&lt;/code&gt; 等价于&lt;code&gt;@RequestMapping(value=&quot;/users/{userId}&quot;,method=RequestMethod.PUT)&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@PutMapping(&quot;/users/{userId}&quot;)
public ResponseEntity&amp;lt;User&amp;gt; updateUser(@PathVariable(value = &quot;userId&quot;) Long userId,
  @Valid @RequestBody UserUpdateRequest userUpdateRequest) {
  ......
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;DELETE 请求&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@DeleteMapping(&quot;/users/{userId}&quot;)&lt;/code&gt;等价于&lt;code&gt;@RequestMapping(value=&quot;/users/{userId}&quot;,method=RequestMethod.DELETE)&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@DeleteMapping(&quot;/users/{userId}&quot;)
public ResponseEntity deleteUser(@PathVariable(value = &quot;userId&quot;) Long userId){
  ......
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;PATCH 请求&lt;/h4&gt;
&lt;p&gt;一般实际项目中，我们都是 PUT 不够用了之后才用 PATCH 请求去更新数据。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt; @PatchMapping(&quot;/profile&quot;)
  public ResponseEntity updateStudent(@RequestBody StudentUpdateRequest studentUpdateRequest) {
        studentRepository.updateDetail(studentUpdateRequest);
        return ResponseEntity.ok().build();
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;前后端传值&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;掌握前后端传值的正确姿势，是你开始 CRUD 的第一步！&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;@PathVariable&lt;/code&gt; 和 &lt;code&gt;@RequestParam&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@PathVariable&lt;/code&gt;用于获取路径参数，&lt;code&gt;@RequestParam&lt;/code&gt;用于获取查询参数。&lt;/p&gt;
&lt;p&gt;举个简单的例子：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@GetMapping(&quot;/klasses/{klassId}/teachers&quot;)
public List&amp;lt;Teacher&amp;gt; getKlassRelatedTeachers(
         @PathVariable(&quot;klassId&quot;) Long klassId,
         @RequestParam(value = &quot;type&quot;, required = false) String type ) {
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果我们请求的 url 是：&lt;code&gt;/klasses/123456/teachers?type=web&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;那么我们服务获取到的数据就是：&lt;code&gt;klassId=123456,type=web&lt;/code&gt;。&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;@RequestBody&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;用于读取 Request 请求（可能是 POST,PUT,DELETE,GET 请求）的 body 部分并且&lt;strong&gt;Content-Type 为 application/json&lt;/strong&gt; 格式的数据，接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用&lt;code&gt;HttpMessageConverter&lt;/code&gt;或者自定义的&lt;code&gt;HttpMessageConverter&lt;/code&gt;将请求的 body 中的 json 字符串转换为 java 对象。&lt;/p&gt;
&lt;p&gt;我用一个简单的例子来给演示一下基本使用！&lt;/p&gt;
&lt;p&gt;我们有一个注册的接口：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@PostMapping(&quot;/sign-up&quot;)
public ResponseEntity signUp(@RequestBody @Valid UserRegisterRequest userRegisterRequest) {
  userService.save(userRegisterRequest);
  return ResponseEntity.ok().build();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;UserRegisterRequest&lt;/code&gt;对象：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRegisterRequest {
    @NotBlank
    private String userName;
    @NotBlank
    private String password;
    @NotBlank
    private String fullName;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们发送 post 请求到这个接口，并且 body 携带 JSON 数据：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{&quot;userName&quot;:&quot;coder&quot;,&quot;fullName&quot;:&quot;shuangkou&quot;,&quot;password&quot;:&quot;123456&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样我们的后端就可以直接把 json 格式的数据映射到我们的 &lt;code&gt;UserRegisterRequest&lt;/code&gt; 类上。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/c0e6995d-b34e-4bed-b0c2-861f2cde6fdf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;👉 需要注意的是：&lt;strong&gt;一个请求方法只可以有一个&lt;code&gt;@RequestBody&lt;/code&gt;，但是可以有多个&lt;code&gt;@RequestParam&lt;/code&gt;和&lt;code&gt;@PathVariable&lt;/code&gt;&lt;/strong&gt;。 如果你的方法必须要用两个 &lt;code&gt;@RequestBody&lt;/code&gt;来接受数据的话，大概率是你的数据库设计或者系统设计出问题了！&lt;/p&gt;
&lt;h3&gt;参数校验&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;数据的校验的重要性就不用说了，即使在前端对数据进行校验的情况下，我们还是要对传入后端的数据再进行一遍校验，避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JSR(Java Specification Requests）&lt;/strong&gt; 是一套 JavaBean 参数校验的标准，它定义了很多常用的校验注解，我们可以直接将这些注解加在我们 JavaBean 的属性上面，这样就可以在需要校验的时候进行校验了，非常方便！&lt;/p&gt;
&lt;p&gt;校验的时候我们实际用的是 &lt;strong&gt;Hibernate Validator&lt;/strong&gt; 框架。Hibernate Validator 是 Hibernate 团队最初的数据校验框架，Hibernate Validator 4.x 是 Bean Validation 1.0（JSR 303）的参考实现，Hibernate Validator 5.x 是 Bean Validation 1.1（JSR 349）的参考实现，目前最新版的 Hibernate Validator 6.x 是 Bean Validation 2.0（JSR 380）的参考实现。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注&lt;/strong&gt;：更新版本的 spring-boot-starter-web 依赖中不再有 hibernate-validator 包（如2.3.11.RELEASE），需要自己引入 &lt;code&gt;spring-boot-starter-validation&lt;/code&gt; 依赖。&lt;/p&gt;
&lt;p&gt;非 SpringBoot 项目需要自行引入相关依赖包，这里不多做讲解，具体可以查看我的这篇文章：《&lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&amp;amp;mid=2247485783&amp;amp;idx=1&amp;amp;sn=a407f3b75efa17c643407daa7fb2acd6&amp;amp;chksm=cea2469cf9d5cf8afbcd0a8a1c9cc4294d6805b8e01bee6f76bb2884c5bc15478e91459def49&amp;amp;token=292197051&amp;amp;lang=zh_CN#rd&quot;&gt;如何在 Spring/Spring Boot 中做参数校验？你需要了解的都在这里！open in new window&lt;/a&gt;》。&lt;/p&gt;
&lt;p&gt;👉 需要注意的是： &lt;strong&gt;所有的注解，推荐使用 JSR 注解，即&lt;code&gt;javax.validation.constraints&lt;/code&gt;，而不是&lt;code&gt;org.hibernate.validator.constraints&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;一些常用的字段验证的注解&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@NotEmpty&lt;/code&gt; 被注释的字符串的不能为 null 也不能为空&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@NotBlank&lt;/code&gt; 被注释的字符串非 null，并且必须包含一个非空白字符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Null&lt;/code&gt; 被注释的元素必须为 null&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@NotNull&lt;/code&gt; 被注释的元素必须不为 null&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@AssertTrue&lt;/code&gt; 被注释的元素必须为 true&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@AssertFalse&lt;/code&gt; 被注释的元素必须为 false&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Pattern(regex=,flag=)&lt;/code&gt;被注释的元素必须符合指定的正则表达式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Email&lt;/code&gt; 被注释的元素必须是 Email 格式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Min(value)&lt;/code&gt;被注释的元素必须是一个数字，其值必须大于等于指定的最小值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Max(value)&lt;/code&gt;被注释的元素必须是一个数字，其值必须小于等于指定的最大值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@DecimalMin(value)&lt;/code&gt;被注释的元素必须是一个数字，其值必须大于等于指定的最小值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@DecimalMax(value)&lt;/code&gt; 被注释的元素必须是一个数字，其值必须小于等于指定的最大值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Size(max=, min=)&lt;/code&gt;被注释的元素的大小必须在指定的范围内&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Digits(integer, fraction)&lt;/code&gt;被注释的元素必须是一个数字，其值必须在可接受的范围内&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Past&lt;/code&gt;被注释的元素必须是一个过去的日期&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Future&lt;/code&gt; 被注释的元素必须是一个将来的日期&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;验证请求体(RequestBody)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {

    @NotNull(message = &quot;classId 不能为空&quot;)
    private String classId;

    @Size(max = 33)
    @NotNull(message = &quot;name 不能为空&quot;)
    private String name;

    @Pattern(regexp = &quot;((^Man$|^Woman$|^UGM$))&quot;, message = &quot;sex 值不在可选范围&quot;)
    @NotNull(message = &quot;sex 不能为空&quot;)
    private String sex;

    @Email(message = &quot;email 格式不正确&quot;)
    @NotNull(message = &quot;email 不能为空&quot;)
    private String email;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们在需要验证的参数上加上了&lt;code&gt;@Valid&lt;/code&gt;注解，如果验证失败，它将抛出&lt;code&gt;MethodArgumentNotValidException&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RestController
@RequestMapping(&quot;/api&quot;)
public class PersonController {

    @PostMapping(&quot;/person&quot;)
    public ResponseEntity&amp;lt;Person&amp;gt; getPerson(@RequestBody @Valid Person person) {
        return ResponseEntity.ok().body(person);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;验证请求参数(Path Variables 和 Request Parameters)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;一定一定不要忘记在类上加上 &lt;code&gt;@Validated&lt;/code&gt; 注解了，这个参数可以告诉 Spring 去校验方法参数。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RestController
@RequestMapping(&quot;/api&quot;)
@Validated
public class PersonController {

    @GetMapping(&quot;/person/{id}&quot;)
    public ResponseEntity&amp;lt;Integer&amp;gt; getPersonByID(@Valid @PathVariable(&quot;id&quot;) @Max(value = 5,message = &quot;超过 id 的范围了&quot;) Integer id) {
        return ResponseEntity.ok().body(id);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更多关于如何在 Spring 项目中进行参数校验的内容，请看《&lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&amp;amp;mid=2247485783&amp;amp;idx=1&amp;amp;sn=a407f3b75efa17c643407daa7fb2acd6&amp;amp;chksm=cea2469cf9d5cf8afbcd0a8a1c9cc4294d6805b8e01bee6f76bb2884c5bc15478e91459def49&amp;amp;token=292197051&amp;amp;lang=zh_CN#rd&quot;&gt;如何在 Spring/Spring Boot 中做参数校验？你需要了解的都在这里！open in new window&lt;/a&gt;》这篇文章。&lt;/p&gt;
&lt;h3&gt;全局处理 Controller 层异常&lt;/h3&gt;
&lt;p&gt;介绍一下我们 Spring 项目必备的全局处理 Controller 层异常。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;相关注解：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;@ControllerAdvice&lt;/code&gt; :注解定义全局异常处理类&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ExceptionHandler&lt;/code&gt; :注解声明异常处理方法&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如何使用呢？拿我们在第 5 节参数校验这块来举例子。如果方法参数不对的话就会抛出&lt;code&gt;MethodArgumentNotValidException&lt;/code&gt;，我们来处理这个异常。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

    /**
     * 请求参数异常处理
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity&amp;lt;?&amp;gt; handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, HttpServletRequest request) {
       ......
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更多关于 Spring Boot 异常处理的内容，请看我的这两篇文章：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&amp;amp;mid=2247485568&amp;amp;idx=2&amp;amp;sn=c5ba880fd0c5d82e39531fa42cb036ac&amp;amp;chksm=cea2474bf9d5ce5dcbc6a5f6580198fdce4bc92ef577579183a729cb5d1430e4994720d59b34&amp;amp;token=2133161636&amp;amp;lang=zh_CN#rd&quot;&gt;SpringBoot 处理异常的几种常见姿势open in new window&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&amp;amp;mid=2247486379&amp;amp;idx=2&amp;amp;sn=48c29ae65b3ed874749f0803f0e4d90e&amp;amp;chksm=cea24460f9d5cd769ed53ad7e17c97a7963a89f5350e370be633db0ae8d783c3a3dbd58c70f8&amp;amp;token=1054498516&amp;amp;lang=zh_CN#rd&quot;&gt;使用枚举简单封装一个优雅的 Spring Boot 全局异常处理！&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;JPA 相关&lt;/h3&gt;
&lt;h4&gt;创建表&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@Entity&lt;/code&gt;声明一个类对应一个数据库实体。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@Table&lt;/code&gt; 设置表名&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Entity
@Table(name = &quot;role&quot;)
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String description;
    省略getter/setter......
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;创建主键&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@Id&lt;/code&gt; ：声明一个字段为主键。&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;@Id&lt;/code&gt;声明之后，我们还需要定义主键的生成策略。我们可以使用 &lt;code&gt;@GeneratedValue&lt;/code&gt; 指定主键生成策略。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 通过 &lt;code&gt;@GeneratedValue&lt;/code&gt;直接使用 JPA 内置提供的四种主键生成策略来指定主键生成策略。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JPA 使用枚举定义了 4 种常见的主键生成策略，如下：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;枚举替代常量的一种用法&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public enum GenerationType {

    /**
     * 使用一个特定的数据库表格来保存主键
     * 持久化引擎通过关系数据库的一张特定的表格来生成主键,
     */
    TABLE,

    /**
     *在某些数据库中,不支持主键自增长,比如Oracle、PostgreSQL其提供了一种叫做&quot;序列(sequence)&quot;的机制生成主键
     */
    SEQUENCE,

    /**
     * 主键自增长
     */
    IDENTITY,

    /**
     *把主键生成策略交给持久化引擎(persistence engine),
     *持久化引擎会根据数据库在以上三种主键生成 策略中选择其中一种
     */
    AUTO
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;@GeneratedValue&lt;/code&gt;注解默认使用的策略是&lt;code&gt;GenerationType.AUTO&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public @interface GeneratedValue {

    GenerationType strategy() default AUTO;
    String generator() default &quot;&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一般使用 MySQL 数据库的话，使用&lt;code&gt;GenerationType.IDENTITY&lt;/code&gt;策略比较普遍一点（分布式系统的话需要另外考虑使用分布式 ID）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.通过 &lt;code&gt;@GenericGenerator&lt;/code&gt;声明一个主键策略，然后 &lt;code&gt;@GeneratedValue&lt;/code&gt;使用这个策略&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Id
@GeneratedValue(generator = &quot;IdentityIdGenerator&quot;)
@GenericGenerator(name = &quot;IdentityIdGenerator&quot;, strategy = &quot;identity&quot;)
private Long id;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等价于：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;jpa 提供的主键生成策略有如下几种：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class DefaultIdentifierGeneratorFactory
        implements MutableIdentifierGeneratorFactory, Serializable, ServiceRegistryAwareService {

    @SuppressWarnings(&quot;deprecation&quot;)
    public DefaultIdentifierGeneratorFactory() {
        register( &quot;uuid2&quot;, UUIDGenerator.class );
        register( &quot;guid&quot;, GUIDGenerator.class );            // can be done with UUIDGenerator + strategy
        register( &quot;uuid&quot;, UUIDHexGenerator.class );         // &quot;deprecated&quot; for new use
        register( &quot;uuid.hex&quot;, UUIDHexGenerator.class );     // uuid.hex is deprecated
        register( &quot;assigned&quot;, Assigned.class );
        register( &quot;identity&quot;, IdentityGenerator.class );
        register( &quot;select&quot;, SelectGenerator.class );
        register( &quot;sequence&quot;, SequenceStyleGenerator.class );
        register( &quot;seqhilo&quot;, SequenceHiLoGenerator.class );
        register( &quot;increment&quot;, IncrementGenerator.class );
        register( &quot;foreign&quot;, ForeignGenerator.class );
        register( &quot;sequence-identity&quot;, SequenceIdentityGenerator.class );
        register( &quot;enhanced-sequence&quot;, SequenceStyleGenerator.class );
        register( &quot;enhanced-table&quot;, TableGenerator.class );
    }

    public void register(String strategy, Class generatorClass) {
        LOG.debugf( &quot;Registering IdentifierGenerator strategy [%s] -&amp;gt; [%s]&quot;, strategy, generatorClass.getName() );
        final Class previous = generatorStrategyToClassNameMap.put( strategy, generatorClass );
        if ( previous != null ) {
            LOG.debugf( &quot;    - overriding [%s]&quot;, previous.getName() );
        }
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;设置字段类型&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@Column&lt;/code&gt; 声明字段。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;设置属性 userName 对应的数据库字段名为 user_name，长度为 32，非空。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Column(name = &quot;user_name&quot;, nullable = false, length=32)
private String userName;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置字段类型并且加默认值，这个还是挺常用的。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Column(columnDefinition = &quot;tinyint(1) default 1&quot;)
private Boolean enabled;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;指定不持久化特定字段&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@Transient&lt;/code&gt; ：声明不需要与数据库映射的字段，在保存的时候不需要保存进数据库 。&lt;/p&gt;
&lt;p&gt;如果我们想让&lt;code&gt;secrect&lt;/code&gt; 这个字段不被持久化，可以使用 &lt;code&gt;@Transient&lt;/code&gt;关键字声明。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Entity(name=&quot;USER&quot;)
public class User {

    ......
    @Transient
    private String secrect; // not persistent because of @Transient

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;除了 &lt;code&gt;@Transient&lt;/code&gt;关键字声明， 还可以采用下面几种方法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;static String secrect; // not persistent because of static
final String secrect = &quot;Satish&quot;; // not persistent because of final
transient String secrect; // not persistent because of transient&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一般使用注解的方式比较多。&lt;/p&gt;
&lt;h4&gt;声明大字段&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@Lob&lt;/code&gt;:声明某个字段为大字段。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Lob
private String content;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更详细的声明：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Lob
//指定 Lob 类型数据的获取策略， FetchType.EAGER 表示非延迟加载，而 FetchType.LAZY 表示延迟加载 ；
@Basic(fetch = FetchType.EAGER)
//columnDefinition 属性指定数据表对应的 Lob 字段类型
@Column(name = &quot;content&quot;, columnDefinition = &quot;LONGTEXT NOT NULL&quot;)
private String content;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;创建枚举类型的字段&lt;/h4&gt;
&lt;p&gt;可以使用枚举类型的字段，不过枚举字段要用&lt;code&gt;@Enumerated&lt;/code&gt;注解修饰。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public enum Gender {
    MALE(&quot;男性&quot;),
    FEMALE(&quot;女性&quot;);

    private String value;
    Gender(String str){
        value=str;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Entity
@Table(name = &quot;role&quot;)
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String description;
    @Enumerated(EnumType.STRING)
    private Gender gender;
    省略getter/setter......
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数据库里面对应存储的是 MALE/FEMALE。&lt;/p&gt;
&lt;h4&gt;增加审计功能&lt;/h4&gt;
&lt;p&gt;只要继承了 &lt;code&gt;AbstractAuditBase&lt;/code&gt;的类都会默认加上下面四个字段。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Data
@AllArgsConstructor
@NoArgsConstructor
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public abstract class AbstractAuditBase {

    @CreatedDate
    @Column(updatable = false)
    @JsonIgnore
    private Instant createdAt;

    @LastModifiedDate
    @JsonIgnore
    private Instant updatedAt;

    @CreatedBy
    @Column(updatable = false)
    @JsonIgnore
    private String createdBy;

    @LastModifiedBy
    @JsonIgnore
    private String updatedBy;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们对应的审计功能对应地配置类可能是下面这样的（Spring Security 项目）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
@EnableJpaAuditing
public class AuditSecurityConfiguration {
    @Bean
    AuditorAware&amp;lt;String&amp;gt; auditorAware() {
        return () -&amp;gt; Optional.ofNullable(SecurityContextHolder.getContext())
                .map(SecurityContext::getAuthentication)
                .filter(Authentication::isAuthenticated)
                .map(Authentication::getName);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;简单介绍一下上面涉及到的一些注解：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;@CreatedDate&lt;/code&gt;: 表示该字段为创建时间字段，在这个实体被 insert 的时候，会设置值&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@CreatedBy&lt;/code&gt; :表示该字段为创建人，在这个实体被 insert 的时候，会设置值&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@LastModifiedDate&lt;/code&gt;、&lt;code&gt;@LastModifiedBy&lt;/code&gt;同理。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;@EnableJpaAuditing&lt;/code&gt;：开启 JPA 审计功能。&lt;/p&gt;
&lt;h4&gt;删除/修改数据&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@Modifying&lt;/code&gt; 注解提示 JPA 该操作是修改操作,注意还要配合&lt;code&gt;@Transactional&lt;/code&gt;注解使用。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Repository
public interface UserRepository extends JpaRepository&amp;lt;User, Integer&amp;gt; {

    @Modifying
    @Transactional(rollbackFor = Exception.class)
    void deleteByUserName(String userName);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;关联关系&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@OneToOne&lt;/code&gt; 声明一对一关系&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@OneToMany&lt;/code&gt; 声明一对多关系&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ManyToOne&lt;/code&gt; 声明多对一关系&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ManyToMany&lt;/code&gt; 声明多对多关系&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更多关于 Spring Boot JPA 的文章请看我的这篇文章：&lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&amp;amp;mid=2247485689&amp;amp;idx=1&amp;amp;sn=061b32c2222869932be5631fb0bb5260&amp;amp;chksm=cea24732f9d5ce24a356fb3675170e7843addbfcc79ee267cfdb45c83fc7e90babf0f20d22e1&amp;amp;token=292197051&amp;amp;lang=zh_CN#rd&quot;&gt;一文搞懂如何在 Spring Boot 正确中使用 JPAopen in new window&lt;/a&gt; 。&lt;/p&gt;
&lt;h3&gt;事务 &lt;code&gt;@Transactional&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;在要开启事务的方法上使用&lt;code&gt;@Transactional&lt;/code&gt;注解即可！&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Transactional(rollbackFor = Exception.class)
public void save() {
  ......
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在&lt;code&gt;@Transactional&lt;/code&gt;注解中如果不配置&lt;code&gt;rollbackFor&lt;/code&gt;属性,那么事务只会在遇到&lt;code&gt;RuntimeException&lt;/code&gt;的时候才会回滚,加上&lt;code&gt;rollbackFor=Exception.class&lt;/code&gt;,可以让事务在遇到非运行时异常时也回滚。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@Transactional&lt;/code&gt; 注解一般可以作用在&lt;code&gt;类&lt;/code&gt;或者&lt;code&gt;方法&lt;/code&gt;上。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用于类&lt;/strong&gt;：当把&lt;code&gt;@Transactional&lt;/code&gt; 注解放在类上时，表示所有该类的 public 方法都配置相同的事务属性信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用于方法&lt;/strong&gt;：当类配置了&lt;code&gt;@Transactional&lt;/code&gt;，方法也配置了&lt;code&gt;@Transactional&lt;/code&gt;，方法的事务会覆盖类的事务配置信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更多关于 Spring 事务的内容请查看我的这篇文章：&lt;a href=&quot;https://javaguide.cn/system-design/framework/spring/spring-transaction.html&quot;&gt;可能是最漂亮的 Spring 事务管理详解&lt;/a&gt; 。&lt;/p&gt;
&lt;h3&gt;json 数据处理&lt;/h3&gt;
&lt;h4&gt;过滤 json 数据&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;@JsonIgnoreProperties&lt;/code&gt; 作用在类上用于过滤掉特定字段不返回或者不解析。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;//生成json时将userRoles属性过滤
@JsonIgnoreProperties({&quot;userRoles&quot;})
public class User {

    private String userName;
    private String fullName;
    private String password;
    private List&amp;lt;UserRole&amp;gt; userRoles = new ArrayList&amp;lt;&amp;gt;();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;@JsonIgnore&lt;/code&gt;一般用于类的属性上，作用和上面的&lt;code&gt;@JsonIgnoreProperties&lt;/code&gt; 一样。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class User {

    private String userName;
    private String fullName;
    private String password;
   //生成json时将userRoles属性过滤
    @JsonIgnore
    private List&amp;lt;UserRole&amp;gt; userRoles = new ArrayList&amp;lt;&amp;gt;();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;格式化 json 数据&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@JsonFormat&lt;/code&gt;一般用来格式化 json 数据。&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@JsonFormat(shape=JsonFormat.Shape.STRING, pattern=&quot;yyyy-MM-dd&#039;T&#039;HH:mm:ss.SSS&#039;Z&#039;&quot;, timezone=&quot;GMT&quot;)
private Date date;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;扁平化对象&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Getter
@Setter
@ToString
public class Account {
    private Location location;
    private PersonInfo personInfo;

  @Getter
  @Setter
  @ToString
  public static class Location {
     private String provinceName;
     private String countyName;
  }
  @Getter
  @Setter
  @ToString
  public static class PersonInfo {
    private String userName;
    private String fullName;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;未扁平化之前：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &quot;location&quot;: {
        &quot;provinceName&quot;:&quot;湖北&quot;,
        &quot;countyName&quot;:&quot;武汉&quot;
    },
    &quot;personInfo&quot;: {
        &quot;userName&quot;: &quot;coder1234&quot;,
        &quot;fullName&quot;: &quot;shaungkou&quot;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用&lt;code&gt;@JsonUnwrapped&lt;/code&gt; 扁平对象之后：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Getter
@Setter
@ToString
public class Account {
    @JsonUnwrapped
    private Location location;
    @JsonUnwrapped
    private PersonInfo personInfo;
    ......
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;provinceName&quot;:&quot;湖北&quot;,
  &quot;countyName&quot;:&quot;武汉&quot;,
  &quot;userName&quot;: &quot;coder1234&quot;,
  &quot;fullName&quot;: &quot;shaungkou&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;测试相关&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;@ActiveProfiles&lt;/code&gt;一般作用于测试类上， 用于声明生效的 Spring 配置文件。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@SpringBootTest(webEnvironment = RANDOM_PORT)
@ActiveProfiles(&quot;test&quot;)
@Slf4j
public abstract class TestBase {
  ......
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;@Test&lt;/code&gt;声明一个方法为测试方法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;@Transactional&lt;/code&gt;被声明的测试方法的数据会回滚，避免污染测试数据。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;@WithMockUser&lt;/code&gt; Spring Security 提供的，用来模拟一个真实用户，并且可以赋予权限。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Test
@Transactional
@WithMockUser(username = &quot;user-id-18163138155&quot;, authorities = &quot;ROLE_TEACHER&quot;)
void should_import_student_success() throws Exception {
    ......
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：&lt;a href=&quot;https://javaguide.cn/system-design/framework/spring/spring-common-annotations.html&quot;&gt;# Spring&amp;amp;Spring Boot 常用注解总结！&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Spring-SpringBoot%E5%B8%B8%E7%94%A8%E6%B3%A8%E8%A7%A3%E6%80%BB%E7%BB%93.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Spring-SpringBoot%E5%B8%B8%E7%94%A8%E6%B3%A8%E8%A7%A3%E6%80%BB%E7%BB%93.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>SpringBoot日志</title>
            <description>
            &lt;!--
author: admin
date: 2022-06-29
title: SpringBoot日志
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;SpringBoot日志&lt;/h1&gt;
&lt;h4&gt;基本介绍&lt;/h4&gt;
&lt;p&gt;市面上常见的日志框架有很多。通常情况下，日志是由一个抽象层+实现层的组合来搭建的，而用户通常来说不应该直接使用具体的日志实现类，应该使用日志的抽象层。  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;抽象层：JCL（Jakarta Commons Logging）、SLF4j（Simple Logging Facade for Java）、jboss-logging&lt;/li&gt;
&lt;li&gt;实现层：Log4j 、JUL（java.util.logging）、Log4j2、Logback&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SpringBoot 默认选择的是 SLF4J + Logback 的组合，如果不需要更改为其他日志系统（如 Log4j2 等），则无需多余的配置，LogBack 默认会将日志打印到控制台上。&lt;/p&gt;
&lt;p&gt;由于新建的 Spring Boot 项目一般都会引用 spring-boot-starter 或者 spring-boot-starter-web，而这两个起步依赖中都已经包含了对于 spring-boot-starter-logging 的依赖，所以，我们无需额外添加依赖。&lt;/p&gt;
&lt;h4&gt;基本用法&lt;/h4&gt;
&lt;p&gt;这里我们打印出 5 种不同级别的日志，可以看到控制台会输出相关日志信息：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RestController
public class HelloController {

    Logger logger = LoggerFactory.getLogger(getClass());

    @GetMapping(&quot;/test&quot;)
    public void test(){
        logger.trace(&quot;Trace 日志...&quot;);
        logger.debug(&quot;Debug 日志...&quot;);
        logger.info(&quot;Info 日志...&quot;);
        logger.warn(&quot;Warn 日志...&quot;);
        logger.error(&quot;Error 日志...&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e3f7684c-7414-4da1-92f2-bb47f3b31fe2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果项目有使用 Lombok 的话，直接使用 @Slf4j 注解可以省去从日志工厂生成日志对象这一步，直接进行日志记录。下面代码的效果同上面是一样的：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RestController
@Slf4j
public class HelloController {

    @GetMapping(&quot;/test&quot;)
    public void test(){
        log.trace(&quot;Trace 日志...&quot;);
        log.debug(&quot;Debug 日志...&quot;);
        log.info(&quot;Info 日志...&quot;);
        log.warn(&quot;Warn 日志...&quot;);
        log.error(&quot;Error 日志...&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;设置日志级别&lt;/h4&gt;
&lt;p&gt;日志级别从小到大为 trace &amp;lt; debug &amp;lt; info &amp;lt; warn &amp;lt; error &amp;lt; fatal，由于默认日志级别设置为 INFO，因此上面样例 trace 和 debug 级别的日志都看不到。&lt;/p&gt;
&lt;p&gt;我们可以在 applicaition.properties 文件中修改日志级别。比如下面将全局日志级别都改成 trace，因此系统所有的日志都能看到：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;logging.level.root=trace&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/78bddea1-da04-46c5-9a75-4a9db04d0ad3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们也可以只设置某个包的日志级别，这样能够更方便准确地定位问题。比如下面配置，只对所有 com.example 包下面产生的日志级别改成 trace：  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;logging.level.com.example=trace&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/79311cb3-8dd5-4027-afdb-747c435e0d86.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;生成日志文件&lt;/h4&gt;
&lt;p&gt;除了将日志打印到控制台中，项目上线后通常还需要将日志输出到文件。我们只需要通过 logging.file.path 配置文件存放路径即可：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;logging.file.path=/Volumes/BOOTCAMP/log&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过 logging.file.path 生成的日志文件名字为 spring.log，如果需要自定义文件名字，则通过 logging.file.name 属性进行配置（此时不需要再配置 logging.file.path）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;logging.file.name=/Volumes/BOOTCAMP/log/my.log&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;无论何种设置，Spring Boot 都会自动按天分割日志文件，也就是说每天都会自动生成一个新的 log 文件，而之前的会自动打成 GZ 压缩包。&lt;/p&gt;
&lt;p&gt;除此之外，我们还可以设置日志文件的保留时间，以及单个文件的大小：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;# 日志文件大小
logging.file.max-size=10MB
# 保留的日志时间
logging.file.max-history=10&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;日志输出格式配置&lt;/h4&gt;
&lt;p&gt;我们可以分别修改在控制台输出的日志格式，以及文件中日志输出的格式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;%d{HH:mm:ss.SSS}&lt;/code&gt;：日志输出时间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%-5level&lt;/code&gt;：日志级别，并且使用 5 个字符靠左对齐&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%thread&lt;/code&gt;：输出日志的进程名字，这在 Web 应用以及异步任务处理中很有用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%logger&lt;/code&gt;：日志输出者的名字&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%msg&lt;/code&gt;：日志消息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%n&lt;/code&gt;：平台的换行符&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;# 修改在控制台输出的日志格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger : %msg%n
# 修改输出到文件的日志格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger : %msg%n&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e2b3d78f-8212-4336-9338-41f7ee5af850.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果觉得类名太长（%logger），我们还可以将其设置个长度限制。比如下面限制长度为 45 个字符，超过得话包名部分会变成缩写：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;# 修改在控制台输出的日志格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %clr(%5p) [%thread] %clr(%logger{45}){cyan} : %msg%n
# 修改输出到文件的日志格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger : %msg%n&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/211b696b-ae84-436c-ba3c-5718d77b0a1e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;文本来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.hangge.com/blog/cache/detail_2826.html&quot;&gt;SpringBoot - 日志的配置和使用详解（SLF4j、Logback） (hangge.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging&quot;&gt;Core Features (spring.io)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringBoot%E6%97%A5%E5%BF%97.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringBoot%E6%97%A5%E5%BF%97.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring异步任务</title>
            <description>
            &lt;!--
author: admin
date: 2022-06-07
title: Spring异步任务
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring异步任务&lt;/h1&gt;
&lt;p&gt;Spring 异步任务机制非常的有用，特别是在那些记录日志、发端短信、发送邮件等等非核心的业务上面，或者用在一些系统内部任务上，可以优化代码结构，加快程序响应速度，提升用户体验。&lt;/p&gt;
&lt;p&gt;这里使用 Springboot 框架来演示&lt;/p&gt;
&lt;p&gt;Spring 异步任务&lt;strong&gt;默认关闭&lt;/strong&gt;的，我们需要使用 &lt;code&gt;@EnableAsync&lt;/code&gt;开启异步任务&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
@EnableAsync
public class SpringAsyncConfig {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Spring 异步任务需要在相关的方法上设置 &lt;code&gt;@Async&lt;/code&gt; 注解，这里为了举例，我们创建一个 &lt;code&gt;EmailService&lt;/code&gt; 类，专用完成邮件服务。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Slf4j
@Service
public class EmailService {

   Logger logger = Logger.getGlobal();
    /**
     * 不带返回值的异步任务
     */
    @SneakyThrows
    @Async
    public void sendEmailAsync() {
        logger.info(&quot;使用 Spring 异步任务发送邮件示例&quot;);
        // 模拟邮件发送耗时
        TimeUnit.SECONDS.sleep(10L);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述配置完成之后，我们只需要在调用方，比如上一层 &lt;code&gt;Controller&lt;/code&gt; 注入这个 &lt;code&gt;EmailService&lt;/code&gt; ,然后直接调用这个方法，该方法将会在异步线程中执行。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Slf4j
@RestController
public class RegisterController {

    Logger logger = Logger.getGlobal();

    @Autowired
    EmailService emailService;

    @RequestMapping(&quot;register&quot;)
    public String register() {
     logger.info(&quot;注册流程开始&quot;);
     emailService.sendEmailAsync();
        return &quot;success&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出日志如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/fe44d44f-4edd-43f0-931e-b6a95d5344b5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从日志上可以看到，两个方法执行线程不一样，这就说明了&lt;code&gt;EmailService.sendEmailAsync&lt;/code&gt; 被异步线程成功执行。&lt;/p&gt;
&lt;h4&gt;带有返回值的异步任务&lt;/h4&gt;
&lt;p&gt;上面的异步任务比较简单，但是有时我们有需要获取异步任务返回值。&lt;/p&gt;
&lt;p&gt;如果使用线程池执行异步任务，我们可以使用 &lt;code&gt;threadPool.submit&lt;/code&gt; 获取返回对象&lt;code&gt;Future&lt;/code&gt;,接着我们就可以调用其内 &lt;code&gt;get&lt;/code&gt; 方法,获取返回结果。&lt;/p&gt;
&lt;p&gt;在 Spring 异步任务中，我们也可以使用 &lt;code&gt;Future&lt;/code&gt; 获取返回结果，示例代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Async
@SneakyThrows
public Future&amp;lt;String&amp;gt; sendEmailAsyncWithResult() {
    logger.info(&quot;使用 Spring 异步任务发送邮件，并且获取任务返回结果示例&quot;);
    TimeUnit.SECONDS.sleep(10L);
    return AsyncResult.forValue(&quot;success&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里需要注意，这里返回对象我们需要使用 Spring 内部类 &lt;code&gt;AsyncResult&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;Controller 层调用代码如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(&quot;registers&quot;)
private void sendEmailWithResult() {
    Future&amp;lt;String&amp;gt; future = emailService.sendEmailAsyncWithResult();
    try {
        String result = future.get();
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们知道 &lt;code&gt;Future.get&lt;/code&gt; 方法将会一直阻塞，直到异步任务执行成功。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;通过 &lt;a href=&quot;https://stackoverflow.com/questions/21313831/how-to-use-spring-asyncresult-and-future-return&quot;&gt;java - How to use Spring AsyncResult and Future Return - Stack Overflow&lt;/a&gt; 得知 &lt;code&gt;future&lt;/code&gt; 对象并不是结果，而是实际结果的占位符。现在调用者和工作者并行，可以做不同的事情。当调用者调用 &lt;code&gt;future.get()&lt;/code&gt; 而实际结果尚未计算时，这个线程将被阻塞，直到工作者提供结果为止，如果真正的结果已经计算过了，那么调用者会立即得到结果。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;有时候我们获取异步任务的返回值是为了做一下后续业务，但是主流程方法是无需返回异步任务的返回值。如果我们使用了 &lt;code&gt;Future.get()&lt;/code&gt;方法，主流程就会一直被阻塞。&lt;/p&gt;
&lt;p&gt;对于这种场景，我们可以使用&lt;code&gt;org.springframework.util.concurrent.ListenableFuture&lt;/code&gt;稍微改造一下上面的方法。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ListenableFuture&lt;/code&gt; 这个类允许我们注册回调函数，一旦异步任务执行成功,或者执行异常，将会立刻执行回调函数。通过这种方式就可以不用阻塞执行的主线程。&lt;/p&gt;
&lt;p&gt;示例代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Async
@SneakyThrows
public ListenableFuture&amp;lt;String&amp;gt; sendEmailAsyncWithListenableFuture() {
    logger.info(&quot;使用 Spring 异步任务发送邮件，并且获取任务返回结果示例&quot;);
    TimeUnit.SECONDS.sleep(10L);
    return AsyncResult.forValue(&quot;success&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Controller&lt;/code&gt; 层代码如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(&quot;registerss&quot;)
private void sendEmailWithListenableFuture() {

    ListenableFuture&amp;lt;String&amp;gt; listenableFuture = emailService.sendEmailAsyncWithListenableFuture();
    // 异步回调处理
    listenableFuture.addCallback(new SuccessCallback&amp;lt;String&amp;gt;() {
        @Override
        public void onSuccess(String result) {
            logger.info(&quot;异步回调处理返回值&quot;);

        }
    }, new FailureCallback() {
        @Override
        public void onFailure(Throwable ex) {
            logger.warning(&quot;异步回调处理异常&quot;+ ex);
        }
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看到这里，如果有同学有疑惑，我们返回对象是 &lt;code&gt;AsyncResult&lt;/code&gt;,为什么方法返回类可以是&lt;code&gt;Future&lt;/code&gt;,又可以是 &lt;code&gt;ListenableFuture&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;看完这张类继承关系，大家应该就知道答案了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://uploadfiles.nowcoder.com/images/20211009/682990133_1633770070167_5A9F6A51E994577B680762E995D412F0&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;异常处理方式&lt;/h4&gt;
&lt;p&gt;异步任务中异常处理方式，不是很难，我们只要在方法中将整个代码块 &lt;code&gt;try...catch&lt;/code&gt; 即可。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;try {
 // 其他代码
} catch (Exception e) {
    e.printStackTrace();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一般来说，我们只需要捕获 &lt;code&gt;Exception&lt;/code&gt; 异常，就可以应对大部分情况，但是极端情况下，比如方法内发生 &lt;code&gt;OOM&lt;/code&gt;，将会抛出 &lt;code&gt;OutOfMemoryError&lt;/code&gt;。如果发生&lt;code&gt;Error&lt;/code&gt;错误，以上的捕获代码就会失效。&lt;/p&gt;
&lt;p&gt;Spring 的异步任务，默认提供几种异常处理方式，可以统一处理异步任务中的发生的异常。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;带有返回值的异常处理方式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果我们使用带有返回值的异步任务，处理方式就比较简单了，我们只需要捕获 &lt;code&gt;Future.get()&lt;/code&gt; 抛出的异常就好了。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;Future&amp;lt;String&amp;gt; future = emailService.sendEmailAsyncWithResult();
try {
    String result = future.get();
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果我们使用 &lt;code&gt;ListenableFuture&lt;/code&gt; 注册回调函数处理，那我们在方法内增加一个 &lt;code&gt;FailureCallback&lt;/code&gt;,在这个实现类处理相关异常即可。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;ListenableFuture&amp;lt;String&amp;gt; listenableFuture = emailService.sendEmailAsyncWithListenableFuture();
// 异步回调处理
listenableFuture.addCallback(new SuccessCallback&amp;lt;String&amp;gt;() {
    @Override
    public void onSuccess(String result) {
        logger.info(&quot;异步回调处理返回值&quot;);

    }
    // 异常处理
}, new FailureCallback() {
    @Override
    public void onFailure(Throwable ex) {
        logger.warning(&quot;异步回调处理异常&quot;,ex);
    }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;统一异常处理方式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;没有返回值的异步任务处理方式就比较复杂了，我们需要继承&lt;code&gt;AsyncConfigurerSupport&lt;/code&gt;，实现 &lt;code&gt;getAsyncUncaughtExceptionHandler&lt;/code&gt; 方法，示例代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Slf4j
@Configuration
public class AsyncErrorHandler extends AsyncConfigurerSupport {

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        AsyncUncaughtExceptionHandler handler = (throwable, method, objects) -&amp;gt; {
            logger.warning(&quot;全局异常捕获&quot;, throwable);
        };
        return handler;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;这个异常处理方式只能处理未带返回值的异步任务。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;异步任务使用注意点&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;异步线程池设置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spring 异步任务默认使用 Spring 内部线程池 &lt;code&gt;SimpleAsyncTaskExecutor&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://uploadfiles.nowcoder.com/images/20211009/682990133_1633770070280_5A9F6A51E994577B680762E995D412F0&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个线程池比较坑爹，不会&lt;strong&gt;复用线程&lt;/strong&gt;。也就是说来一个请求，将会新建一个线程。极端情况下，如果调用次数过多，将会创建大量线程。&lt;/p&gt;
&lt;p&gt;Java 中的线程是会占用一定的内存空间 ，所以创建大量的线程将会导致 &lt;strong&gt;OOM&lt;/strong&gt; 错误。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;所以如果需要使用异步任务，我们需要一定要使用自定义线程池替换默认线程池&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;注解方式配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Configuration
@EnableAsync
public class SpringAsyncConfig {
    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setThreadNamePrefix(&quot;task-Executor-&quot;);
        executor.setMaxPoolSize(10);
        executor.setCorePoolSize(5);
        executor.setQueueCapacity(200);
        // 还有其他参数可以设置
        return executor;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只要我们配置了这个线程池&lt;code&gt;Bean&lt;/code&gt;，Spring 的异步任务都将会使用该线程池执行。&lt;/p&gt;
&lt;p&gt;如果我们应用配置了多个线程池&lt;code&gt;Bean&lt;/code&gt;，异步任务需要指定使用某个线程池执行，我们只需要在 &lt;code&gt;@Async&lt;/code&gt;注解上设置相应 &lt;code&gt;Bean&lt;/code&gt; 的名字即可。示例代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Async(&quot;taskExecutor&quot;)
public void sendEmailAsync() {
    logger.info(&quot;使用 Spring 异步任务发送邮件示例&quot;);
    TimeUnit.SECONDS.sleep(10L);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;异步方法失效&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spring 异步任务背后原理是使用 AOP ，而使用 Spring AOP 时我们需要注意，切勿在方法内部调用其他使用 AOP 的方法，可能有点拗口，我们来看下代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Async
@SneakyThrows
public ListenableFuture&amp;lt;String&amp;gt; sendEmailAsyncWithListenableFuture() {
    // 这样调用，sendEmailAsync 不会异步执行
    sendEmailAsync();
    logger.info(&quot;使用 Spring 异步任务发送邮件，并且获取任务返回结果示例&quot;);
    TimeUnit.SECONDS.sleep(10L);
    return AsyncResult.forValue(&quot;success&quot;);
}

/**
 * 异步发送任务
 */
@SneakyThrows
@Async(&quot;taskExecutor&quot;)
public void sendEmailAsync() {
    logger.info(&quot;使用 Spring 异步任务发送邮件示例&quot;);
    TimeUnit.SECONDS.sleep(10L);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面两个方法都处于同一个类中，这样调用将会导致 AOP 失效，无法起到 AOP 的效果。&lt;/p&gt;
&lt;p&gt;其他类似的 &lt;code&gt;@Transactional&lt;/code&gt;，以及自定义的 AOP 注解都会有这个问题，大家使用过程，千万需要注意这一点。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.nowcoder.net/n/bb2584ceb63f436eacb0ba544cd785a9&quot;&gt;点赞！超详细的一份 Spring 异步任务教程_牛客博客 (nowcoder.net)&lt;/a&gt; 有删改&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/goloving/p/15065732.html&quot;&gt;浅析如何使用Spring的@Async异步任务、自定义线程池及异常处理 - 古兰精 - 博客园 (cnblogs.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/yulinfeng/p/7039979.html&quot;&gt;13.ThreadPoolExecutor线程池之submit方法 - OKevin - 博客园 (cnblogs.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/21313831/how-to-use-spring-asyncresult-and-future-return&quot;&gt;java - How to use Spring AsyncResult and Future Return - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/cml_blog/article/details/80849728&quot;&gt;Spring Async不得不知的用法_cmlbeliever的博客-CSDN博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.liaoxuefeng.com/wiki/1252599548343744/1264738568571776&quot;&gt;使用JDK Logging - 廖雪峰的官方网站 (liaoxuefeng.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Spring%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Spring%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Springboot集成RabbitMQ</title>
            <description>
            &lt;!--
author: admin
date: 2022-06-02
title: Springboot集成RabbitMQ
tags: Spring,RabbitMQ
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Springboot集成RabbitMQ&lt;/h1&gt;
&lt;h3&gt;应用场景&lt;/h3&gt;
&lt;p&gt;一个技术的产生必然有其原因。&lt;/p&gt;
&lt;p&gt;消息队列是一个容器，可以对程序产生的消息进行存储。消息队列的主要用途是削峰、异步、解耦，我们用一个实际场景来解释下。&lt;/p&gt;
&lt;p&gt;有一家果汁生产企业，张三是采购员，负责采购水果；李四、赵五是配送员，分别负责将苹果、香蕉配送到生产车间。&lt;/p&gt;
&lt;h4&gt;削峰&lt;/h4&gt;
&lt;p&gt;传统模式下，张三采购完成，回到公司后，联系李四、赵五配送采购的水果。但是随着公司业务量大增，张三一次性采购的水果，李四、赵五得需要几天才能配送完。所以需要一个仓库，张三采购完成直接放到仓库里，李四、赵五慢慢从仓库取出配送。&lt;/p&gt;
&lt;p&gt;此处的仓库就是消息队列，张三是采购消息的生产者，李四、赵五是消费者。当生产的消息太多时，可以使用队列&lt;code&gt;削峰&lt;/code&gt;，这样消费者可以慢慢处理消息。&lt;/p&gt;
&lt;h4&gt;异步&lt;/h4&gt;
&lt;p&gt;传统模式下，张三采购完成后，需要等待李四、赵五来取，实际上极大浪费了张三的时间。如果直接放入仓库，可以不必等待，直接进行下面的工作。也就是说，张三与李四、赵五的工作是&lt;code&gt;异步&lt;/code&gt;的，减少了等待时间。&lt;/p&gt;
&lt;h4&gt;解耦&lt;/h4&gt;
&lt;p&gt;之前张三采购完成后，有责任通知李四、赵五来取。万一李四、赵五忘带手机，张三还得联系领导协调处理，说实话张三就是个大老粗，整天为这些破事烦得不行。如果直接放入仓库，张三根本不用管李四、赵五的事情，感觉愉快极了。张三与李四、赵五的工作不再互相依赖，都变得更加简单了，这就是解耦。&lt;/p&gt;
&lt;h3&gt;RabbitMQ 简介&lt;/h3&gt;
&lt;p&gt;RabbitMQ 是非常出名的消息中间件，遵循 AMQP 协议，可以跨平台、跨语言使用。 RabbitMQ 具备低时延、高可用的特点，还有简洁易用的可视化管理界面。&lt;/p&gt;
&lt;h4&gt;安装&lt;/h4&gt;
&lt;p&gt;本文主要介绍在 Windows 系统下的使用。&lt;/p&gt;
&lt;p&gt;最新版的 RabbitMQ 需要 64位的 Erlang 依赖，在 &lt;a href=&quot;https://www.rabbitmq.com/install-windows.html#installer&quot;&gt;Installing on Windows — RabbitMQ&lt;/a&gt; 中找到对应的依赖安装包和软件包安装即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/5e91f9d0-07c4-41ff-abf2-50eaad9fc8d6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在写本文的时候，最新的版本如上图所示。&lt;/p&gt;
&lt;p&gt;安装完 RabbitMQ 以后，服务会自动运行，这时环境变量里的 ERLANG_HOME 会自动生成，在”环境变量”中检查是否存在，如果不存在，请在”环境变量”中手动添加，配置 Erlang 环境变量 ERLANG_HOME 。&lt;/p&gt;
&lt;p&gt;如果需要手动启动服务的话：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/b9c1bfd0-5d45-48b4-9f0e-a2e2684f1c2e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开命令行命令行,进入 RabbitMQ 的安装目录下的 sbin 目录&lt;/p&gt;
&lt;p&gt;输入 &lt;code&gt;rabbitmqctl status&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果出现下图，则说明安装成功了，并且 RabbitMQ 已经启动&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/2d3cdd64-9d99-4b03-b978-d3e746c47086.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;乱码是因为 RabbitMQ 需要终端字符集是 &lt;code&gt;UTF-8&lt;/code&gt; 但是 Windows 默认不是，可以不用管。&lt;/p&gt;
&lt;p&gt;开启 RabbitMQ 可视化管理界面&lt;/p&gt;
&lt;p&gt;同样在 sbin 目录下运行 cmd 终端&lt;/p&gt;
&lt;p&gt;输入命令 &lt;code&gt;rabbitmq-plugins enable rabbitmq_management&lt;/code&gt; &lt;/p&gt;
&lt;p&gt;在web浏览器中输入地址：&lt;code&gt;http://localhost:15672/&lt;/code&gt; 输入默认账号 &lt;code&gt;guest&lt;/code&gt; 和默认密码 &lt;code&gt;guest&lt;/code&gt; 即可登录查看 。&lt;/p&gt;
&lt;h3&gt;和 Springboot 集成&lt;/h3&gt;
&lt;p&gt;在 iDEA 下新建项目，并选择以下依赖：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/51dfe0a3-2b03-47dd-8f20-fefd392c84e2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;项目创建后，通过 applicaiton.properties 配置 RabbitMQ 的链接信息&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;spring.rabbitmq.host=localhost # 默认地址
spring.rabbitmq.port=5672 # 默认端口
spring.rabbitmq.username=guest # 默认账号
spring.rabbitmq.password=guest # 默认密码
spring.rabbitmq.virtual-host=/ # 默认虚拟主机 可以理解为 MySQL 中的数据库，可以为每个项目建立一个虚拟主机互不影响&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;建立 RabbitConfig (RabbitMQ的配置类)&lt;/h4&gt;
&lt;p&gt;这里我们以入门为主，先以最小化的配置来定义，完成一个基本的生产和消费过程。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package com.syuez.springrabbitmq.config;

import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;

@Configurable
public class RabbitConfig {
    /**
     * 建立一个叫 hello 的队列配置
     * @return 队列
     */
    @Bean
    public Queue helloQueue() {
        return new Queue(&quot;hello&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;建立 Sender (消息生产者)&lt;/h4&gt;
&lt;p&gt;通过注入 &lt;code&gt;RabbitTemplate&lt;/code&gt; 接口的实例来实现消息的发送。该生产者会将接收到的字符串转发到名叫 hello 的队列中。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package com.syuez.springrabbitmq.rabbit;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
public class Sender {
    @Resource
    private RabbitTemplate rabbitTemplate;
    /**
     * 发送消息
     * @param msg 要发送的消息
     */
    public void send(String msg) {
        System.out.println(&quot;Sender : &quot; + msg);
        this.rabbitTemplate.convertAndSend(&quot;hello&quot;, msg);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;建立 Receiver (消息消费者)&lt;/h4&gt;
&lt;p&gt;通过 &lt;code&gt;@RabbitListener&lt;/code&gt; 注解定义该类对 hello 队列的监听，并用 &lt;code&gt;@RabbitHandler&lt;/code&gt; 注解来指定对消息的处理方法。所以，该消费者实现了对 hello 队列的消费，消费操作为输出消息的字符串内容。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package com.syuez.springrabbitmq.rabbit;

import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queuesToDeclare = @Queue(&quot;hello&quot;))
public class Receiver {
    /**
     * 接收到消息的處理方法
     * @param message 接收到的消息
     */
    @RabbitHandler
    public void process(String message) {
        System.out.println(&quot;Receiver : &quot; + message);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 &lt;code&gt;queuesToDeclare = @Queue(&quot;hello&quot;)&lt;/code&gt; 是自动创建一个叫 hello 的队列。&lt;/p&gt;
&lt;h4&gt;建立 DemoController&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package com.syuez.springrabbitmq.controller;

import com.syuez.springrabbitmq.rabbit.Sender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    @Autowired
    private Sender sender;

    @RequestMapping(value = &quot;/send&quot;,method = RequestMethod.GET)
    public String send(String msg) {
        sender.send(msg);
        return &quot;消息： &quot; + msg + &quot;，已发送!&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动 Springboot 项目。&lt;/p&gt;
&lt;p&gt;打开 &lt;a href=&quot;http://localhost:15672/&quot;&gt;&lt;a href=&quot;http://localhost:15672&quot;&gt;http://localhost:15672&lt;/a&gt;&lt;/a&gt; 查看 RabbitMQ 控制台，点击 Connections 栏，可以看到连接对象，说明已经正常启动了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/7dcf1473-20bb-42c8-a82f-c9a15b8df77d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击 Queues 栏可以查看 hello 队列&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/8cc72286-3e57-4716-b287-119ec1440753.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击 hello 后可查看详情。&lt;/p&gt;
&lt;h4&gt;测试&lt;/h4&gt;
&lt;p&gt;在浏览器打开 &lt;a href=&quot;http://localhost:8080/send?msg=%E6%B5%8B%E8%AF%95&quot;&gt;localhost:8080/send?msg=测试&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/930d7247-671a-4fe3-b501-1492a09f2096.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;完成！&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://morosedog.gitlab.io/springboot-20190414-springboot26/&quot;&gt;SpringBoot - 第二十六章 | RabbitMQ的集成和使用 | J.J.&#039;s Blogs (morosedog.gitlab.io)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/HuanFengZhiQiu/article/details/112848819&quot;&gt;Rabbitmq自动创建队列_Matea1024的博客-CSDN博客_rabbitmq自动创建队列&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://support.huaweicloud.com/rabbitmq_faq/rabbitmq-faq-200518011.html&quot;&gt;如何删除队列和清空队列数据？_分布式消息服务RabbitMQ版_常见问题_实例问题_华为云 (huaweicloud.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.imooc.com/wiki/springbootlesson/rabbitmq.html&quot;&gt;Spring Boot RabbitMQ 应用场景丨慕课网教程 (imooc.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/wade-luffy/p/6003668.html&quot;&gt;RabbitMQ的安装和配置化可视界面 - wade&amp;amp;luffy - 博客园 (cnblogs.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Springboot%E9%9B%86%E6%88%90RabbitMQ.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Springboot%E9%9B%86%E6%88%90RabbitMQ.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>SpringBoot集成Thymeleaf</title>
            <description>
            &lt;!--
author: admin
date: 2022-05-21
title: SpringBoot集成Thymeleaf
tags: Spring,Thymeleaf
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;SpringBoot集成Thymeleaf&lt;/h1&gt;
&lt;h4&gt;创建项目&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;index_files/de33469d-e369-40b6-9562-dc6835ea4bb7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;application.properties&lt;/code&gt; 配置文件中添加 Thymeleaf 的相关配置&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;# Thymeleaf Configuration
spring.thymeleaf.cache=false # 启用模板缓存，开发时应关闭，部署时应开启
spring.thymeleaf.encoding=UTF-8 # 模板编码
spring.thymeleaf.mode=HTML5 # 应用于模板的模板样式，Thymeleaf 必须使用 HTML5 规范
spring.thymeleaf.prefix=classpath:/templates/ # 指定模板页面存放路径
spring.thymeleaf.suffix=.html # 指定模板页面名称的后缀&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里页面存放路径是个坑，有些教程会写 &lt;code&gt;classpath:/resources/templates/&lt;/code&gt; 但是我实际测试是找不到模板，直接改成 &lt;code&gt;classpath:/templates/&lt;/code&gt; 就好了。&lt;/p&gt;
&lt;p&gt;另外作为模板的 html 文件需要在 &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 标签中引入 Thymeleaf 模板标签&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;zh&quot; xmlns:th=&quot;http://www.thymeleaf.org&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html&quot; charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1, shrink-to-fit=no&quot;&amp;gt;
    &amp;lt;title&amp;gt;Hello&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
Hello World!
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;开启热部署&lt;/h4&gt;
&lt;p&gt;在开发过程中要经常修改代码，在修改之后往往需要重启服务，有些服务需要加载很久才能启动成功，这种不必要的重复操作极大降低了程序开发效率。所以 Spring Boot 框架专门提供了进行热部署的依赖启动器，用于进行项目热部署，而无须开发人员手动重启项目。&lt;/p&gt;
&lt;p&gt;热部署需要依赖&lt;code&gt;spring-boot-devtools&lt;/code&gt;，刚刚创建项目的时候我们已经添加了，如果那时没有选择，那就需要手动加入到 &lt;code&gt;pom.xml&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt;
    &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
    &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在&lt;code&gt;&amp;lt;project&amp;gt;&lt;/code&gt;标签内添加：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;...
...
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;repackage&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
...
...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 iDEA 设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/b92e8701-b0a9-4a6e-9240-5cad4947c7c1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/0059bb41-cd0e-48a8-a747-d9de9ada6389.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击应用然后确定即可。&lt;/p&gt;
&lt;p&gt;现在测试下修改代码无须重启即可看到更改结果了。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;文本来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/qq_19007335/article/details/124069635&quot;&gt;[IDEA]2022年最新版本[2021.3.*]配置Spring/SpringBoot热部署 | IDEA 没有compiler.automake.allow.when.app.running选项_haiqiang0225的博客-CSDN博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/31944355/error-resolving-template-index-template-might-not-exist-or-might-not-be-acces&quot;&gt;spring boot - Error resolving template &amp;quot;index&amp;quot;, template might not exist or might not be accessible by any of the configured Template Resolvers - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.hxstrive.com/subject/spring_boot/324.htm&quot;&gt;开启调试功能 - Spring Boot 教程 (hxstrive.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringBoot%E9%9B%86%E6%88%90Thymeleaf.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringBoot%E9%9B%86%E6%88%90Thymeleaf.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>SpringBoot集成MySQL - MyBatis-Plus方式</title>
            <description>
            &lt;!--
author: admin
date: 2022-05-20
title: SpringBoot集成MySQL - MyBatis-Plus方式
tags: Spring,MyBatis-Plus,MySQL
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;SpringBoot集成MySQL - MyBatis-Plus方式&lt;/h1&gt;
&lt;p&gt;MyBatis-Plus（简称 MP）是一个 MyBatis 的增强工具，在 MyBatis 的基础上只做增强不做改变，为简化开发、提高效率而生。MyBatis-Plus 在国内也有很多的用户，本文主要介绍 MyBatis-Plus 和 SpringBoot 的集成。&lt;/p&gt;
&lt;h4&gt;数据准备&lt;/h4&gt;
&lt;p&gt;在 MySQL 数据库中创建一个 springbootdata 数据库&lt;/p&gt;
&lt;p&gt;创建一张 &lt;code&gt;User&lt;/code&gt; 表，其表结构如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;age&lt;/th&gt;
&lt;th&gt;email&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Jone&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;test1@baomidou.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Jack&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;test2@baomidou.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Tom&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;test3@baomidou.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Sandy&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;test4@baomidou.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Billie&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;test5@baomidou.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;其对应的数据库 Schema 脚本如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT &#039;主键ID&#039;,
    name VARCHAR(30) NULL DEFAULT NULL COMMENT &#039;姓名&#039;,
    age INT(11) NULL DEFAULT NULL COMMENT &#039;年龄&#039;,
    email VARCHAR(50) NULL DEFAULT NULL COMMENT &#039;邮箱&#039;,
    PRIMARY KEY (id)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其对应的数据库 Data 脚本如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, &#039;Jone&#039;, 18, &#039;test1@baomidou.com&#039;),
(2, &#039;Jack&#039;, 20, &#039;test2@baomidou.com&#039;),
(3, &#039;Tom&#039;, 28, &#039;test3@baomidou.com&#039;),
(4, &#039;Sandy&#039;, 21, &#039;test4@baomidou.com&#039;),
(5, &#039;Billie&#039;, 24, &#039;test5@baomidou.com&#039;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;在 iDEA 中创建工程&lt;/h4&gt;
&lt;p&gt;使用 Spring Initializer 快速初始化，添加下图的依赖：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/363b26af-6bac-4fbe-8ae9-4ff25db5aeb9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将 pom.xml 中原有的 MyBatis 改成：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;3.5.1&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;编写配置&lt;/h4&gt;
&lt;p&gt;在 &lt;code&gt;application.properties&lt;/code&gt; 配置文件中添加 MySQL 的相关配置&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# MySQL Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root#admin&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;编码&lt;/h4&gt;
&lt;p&gt;创建一个实体类软件包 &lt;code&gt;com.syuez.mybatisplus.entity&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;编写实体类 &lt;code&gt;User.java&lt;/code&gt;（此处使用了 &lt;code&gt;Lombok&lt;/code&gt; 简化代码)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建一个 Mapper 包 &lt;code&gt;com.syuez.mybatisplus.mapper&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;编写 Mapper 包下的 &lt;code&gt;UserMapper&lt;/code&gt;接口&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public interface UserMapper extends BaseMapper&amp;lt;User&amp;gt; {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 Spring Boot 启动类中添加 &lt;code&gt;@MapperScan&lt;/code&gt; 注解，扫描 Mapper 文件夹&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(&quot;com.syuez.mybatisplus.mapper&quot;)
public class MybatisPlusApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;测试&lt;/h4&gt;
&lt;p&gt;添加测试类，进行功能测试：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

import com.syuez.mybatisplus.Entity.User;
import com.syuez.mybatisplus.Mapper.UserMapper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class SampleTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        System.out.println((&quot;----- selectAll method test ------&quot;));
        List&amp;lt;User&amp;gt; userList = userMapper.selectList(null);
        assertEquals(5, userList.size());
        userList.forEach(System.out::println);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试成功：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/2a917491-7e77-4aaa-b519-ec5be21ac84d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但是有个小问题，在 iDEA中， userMapper 使用 @Autowired 注解会提示&amp;quot;无法自动装配，找不到 UserMapper 类型的 Bean&amp;quot;。&lt;/p&gt;
&lt;p&gt;这是因为 MyBatis 自己处理了 Mapper Bean 的生成。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;MyBatis 根据 @MapperScan 的包路径找到所有符合条件的 Mapper&lt;/li&gt;
&lt;li&gt;获取 Spring Bean 管理方面的 Bean，通过代码直接把 Mapper 注入进去&lt;/li&gt;
&lt;li&gt;这时候 Autowired 就能够使用了&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;至于为什么 Autowired 报错，这是因为 IDEA 没有处理 @MapperScan 这个注解，没有去扫描 mapper 是否是一个合格的 bean。&lt;/p&gt;
&lt;p&gt;可以使用 @Resource 替换 @Autowired 解决，@Autowired与@Resource的区别：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。&lt;/li&gt;
&lt;li&gt;@Autowired默认按类型装配（这个注解是属业spring的），默认情况下必须要求依赖对象必须存在，如果要允许null值，可以设置它的required属性为false，如：@Autowired(required=false)&lt;/li&gt;
&lt;li&gt;@Resource 是JDK1.6支持的注解，默认按照名称进行装配。名称可以通过name属性进行指定，如果没有指定name属性，当注解写在字段上时，默认取字段名，按照名称查找。如果注解写在setter方法上默认取属性名进行装配，当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是，如果name属性一旦指定，就只会按照名称进行装配。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pdai.tech/md/spring/springboot/springboot-x-mysql-mybatis-plus.html&quot;&gt;SpringBoot集成MySQL - MyBatis-Plus方式 | Java 全栈知识体系 (pdai.tech)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://juejin.cn/post/6844904087897505805&quot;&gt;springboot整合mybatis mapper注入时报错could not autowire，几种解决方案 - 掘金 (juejin.cn)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://segmentfault.com/q/1010000039963823/a-1020000039964387&quot;&gt;2021.1 版 IDEA 使用 @MapperScan ,出现 Could not autowire - SegmentFault 思否&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.zhihu.com/question/42348457&quot;&gt;Java开发中用到的，lombok是什么？ - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://baomidou.com/pages/226c21/#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B7%A5%E7%A8%8B&quot;&gt;快速开始 | MyBatis-Plus (baomidou.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringBoot%E9%9B%86%E6%88%90MySQL-MyBatis-Plus%E6%96%B9%E5%BC%8F.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringBoot%E9%9B%86%E6%88%90MySQL-MyBatis-Plus%E6%96%B9%E5%BC%8F.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring MVC 之处理表单</title>
            <description>
            &lt;!--
author: admin
date: 2022-05-17
title: Spring MVC 之处理表单
tags: SpringMVC
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring MVC 之处理表单&lt;/h1&gt;
&lt;p&gt;Web 应用的功能通常并不局限于为用户推送内容。大多数的应用允许用户填充表单并将数据提交回应用中，通过这种方式实现与用户的交互。像提供内容一样，Spring MVC 的控制器也为表单处理提供了良好的支持。&lt;/p&gt;
&lt;p&gt;使用表单分为两个方面：&lt;strong&gt;展现表单&lt;/strong&gt;以及&lt;strong&gt;处理用户通过表单提交的数据&lt;/strong&gt;。在 Spittr 应用中，我们需要有个表单让新用户进行注册。SpitterController 是一个新的控制器，目前只有一个请求处理的方法来展现注册表单。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package syuez.web;

import static org.springframework.web.bind.annotation.RequestMethod.*;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import syuez.Spitter;
import syuez.data.SpitterRepository;

@Controller
@RequestMapping(&quot;/spitter&quot;)
public class SpitterController {

    @RequestMapping(value=&quot;/register&quot;, method=GET)  //  处理对 &quot;/spitter/register&quot; 的 GET 请求
    public String showRegistrationForm() {
        return &quot;registerForm&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;showRegistrationForm()&lt;/code&gt; 方法的 @RequestMapping 注解以及类级别上的 @RequestMapping 注解组合起来，声明了这个方法要处理的是针对 &lt;code&gt;/spitter/register&lt;/code&gt; 的 GET 请求。这是一个简单的方法，没有任何输入并且只是返回名为 registerForm 的逻辑视图。按照我们配置InternalResource-ViewResolver的方式，这意味着将会使用 &lt;code&gt;/WEB-INF/views/registerForm.jsp&lt;/code&gt; 这个 JSP 来渲染注册表单。&lt;/p&gt;
&lt;p&gt;尽管 &lt;code&gt;showRegistrationForm()&lt;/code&gt; 方法非常简单，但测试依然需要覆盖到它。因为这个方法很简单，所以它的测试也比较简单。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.junit.Test;
import org.springframework.test.web.servlet.MockMvc;
import syuez.Spitter;
import syuez.data.SpitterRepository;
import syuez.web.SpitterController;

import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;

public class SpitterControllerTest {
    @Test
    public void shouldShowRegistration() throws Exception {
        SpitterRepository mockRepository = mock(SpitterRepository.class);  // // Mock Repository
        SpitterController controller = new SpitterController(mockRepository);
        MockMvc mockMvc = standaloneSetup(controller).build(); // 构建 MockMvc

        mockMvc.perform(get(&quot;/spitter/register&quot;)).andExpect(view().name(&quot;registerForm&quot;));  // 断言 registerForm
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个测试方法与首页控制器(HomeController)的测试非常类似。它对 &lt;code&gt;/spitter/register&lt;/code&gt; 发送 GET 请求，然后断言结果的视图名为 registerForm。&lt;/p&gt;
&lt;p&gt;创建&lt;code&gt;SpitterRepository&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package syuez.data;

import syuez.Spitter;

public interface SpitterRepository {

    Spitter save(Spitter spitter);

    Spitter findByUsername(String username);

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，让我们回到视图上。因为视图的名称为 registerForm，所以 JSP 的名称需要是 registerForm.jsp。这个 JSP 必须要包含一个 HTML &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; 标签，在这个标签中用户输入注册应用的信息。如下就是我们现在所要使用的 JSP。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsonp&quot;&gt;&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@ page session=&quot;false&quot; %&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Spitter&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot;
          href=&quot;&amp;lt;c:url value=&quot;/resources/style.css&quot; /&amp;gt;&quot; &amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Register&amp;lt;/h1&amp;gt;

&amp;lt;form method=&quot;POST&quot;&amp;gt;
    First Name: &amp;lt;input type=&quot;text&quot; name=&quot;firstName&quot; /&amp;gt;&amp;lt;br/&amp;gt;
    Last Name: &amp;lt;input type=&quot;text&quot; name=&quot;lastName&quot; /&amp;gt;&amp;lt;br/&amp;gt;
    Email: &amp;lt;input type=&quot;email&quot; name=&quot;email&quot; /&amp;gt;&amp;lt;br/&amp;gt;
    Username: &amp;lt;input type=&quot;text&quot; name=&quot;username&quot; /&amp;gt;&amp;lt;br/&amp;gt;
    Password: &amp;lt;input type=&quot;password&quot; name=&quot;password&quot; /&amp;gt;&amp;lt;br/&amp;gt;
    &amp;lt;input type=&quot;submit&quot; value=&quot;Register&quot; /&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，这个 JSP 非常基础。它的 HTML 表单域中记录用户的名字、姓氏、用户名以及密码，然后还包含一个提交表单的按钮。在浏览器渲染之后，它的样子大致如图 5.5 所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/0f0f9a2e-b071-4bd5-bdbf-842d6bb5bec6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;需要注意的是：这里的标签中并没有设置 action 属性。在这种情况下，当表单提交时，它会提交到与展现时相同的 URL 路径上。也就是说，它会提交到 &lt;code&gt;/spitter/register&lt;/code&gt; 上。&lt;/p&gt;
&lt;p&gt;这就意味着需要在服务器端处理该 HTTP POST 请求。现在，我们在 SpitterController 中再添加一个方法来处理这个表单提交。&lt;/p&gt;
&lt;h4&gt;编写处理表单的控制器&lt;/h4&gt;
&lt;p&gt;当处理注册表单的 POST 请求时，控制器需要接受表单数据并将表单数据保存为 Spitter 对象。最后，为了防止重复提交（用户点击浏览器的刷新按钮有可能会发生这种情况），应该将浏览器重定向到新创建用户的基本信息页面。这些行为通过下面的 &lt;code&gt;shouldProcessRegistration()&lt;/code&gt; 进行了测试。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Test
public void shouldProcessRegistration() throws Exception {
    SpitterRepository mockRepository = mock(SpitterRepository.class);   // 构建 Repository
    Spitter unsaved = new Spitter(&quot;jbauer&quot;, &quot;24hours&quot;, &quot;Jack&quot;, &quot;Bauer&quot;, &quot;jbauer@ctu.gov&quot;);
    Spitter saved = new Spitter(24L, &quot;jbauer&quot;, &quot;24hours&quot;, &quot;Jack&quot;, &quot;Bauer&quot;, &quot;jbauer@ctu.gov&quot;);
    when(mockRepository.save(unsaved)).thenReturn(saved);

    SpitterController controller = new SpitterController(mockRepository);
    MockMvc mockMvc = standaloneSetup(controller).build();  // 构建 MockMvc

    mockMvc.perform(post(&quot;/spitter/register&quot;)   // 执行请求
                    .param(&quot;firstName&quot;, &quot;Jack&quot;)
                    .param(&quot;lastName&quot;, &quot;Bauer&quot;)
                    .param(&quot;username&quot;, &quot;jbauer&quot;)
                    .param(&quot;password&quot;, &quot;24hours&quot;)
                    .param(&quot;email&quot;, &quot;jbauer@ctu.gov&quot;))
            .andExpect(redirectedUrl(&quot;/spitter/jbauer&quot;));

    verify(mockRepository, atLeastOnce()).save(unsaved);    // 校验保存情况
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显然，这个测试比展现注册表单的测试复杂得多。在构建完 SpitterRepository 的 mock 实现以及所要执行的控制器和 MockMvc 之后，&lt;code&gt;shouldProcess-Registration()&lt;/code&gt; 对 &lt;code&gt;/spitter/register&lt;/code&gt; 发起了一个 POST 请求。作为请求的一部分，用户信息以参数的形式放到 request 中，从而模拟提交的表单。&lt;/p&gt;
&lt;p&gt;在处理 POST 类型的请求时，在请求处理完成后，最好进行一下重定向，这样浏览器的刷新就不会重复提交表单了。在这个测试中，预期请求会重定向到&lt;code&gt;/spitter/jbauer&lt;/code&gt;，也就是新建用户的基本信息页面。&lt;/p&gt;
&lt;p&gt;最后，测试会校验 SpitterRepository 的 mock 实现最终会真正用来保存表单上传入的数据。&lt;/p&gt;
&lt;p&gt;现在，我们来实现处理表单提交的控制器方法。通过 &lt;code&gt;shouldProcessRegistration()&lt;/code&gt; 方法，我们可能认为要满足这个需求需要做很多的工作。但是，在如下的程序清单中，我们可以看到新的 SpitterController 并没有做太多的事情。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 省略 import 部分
@Controller
@RequestMapping(&quot;/spitter&quot;)
public class SpitterController {

    private SpitterRepository spitterRepository;

    @Autowired
    public SpitterController(SpitterRepository spitterRepository) {
        this.spitterRepository = spitterRepository;
    }

    @RequestMapping(value=&quot;/register&quot;, method=GET)  //  处理对 &quot;/spitter/register&quot; 的 GET 请求
    public String showRegistrationForm() {
        return &quot;registerForm&quot;;
    }

    @RequestMapping(value=&quot;/register&quot;, method=POST)
    public String processRegistration(Spitter spitter) {
        spitterRepository.save(spitter);    // 保存 Spitter
        return &quot;redirect:/spitter/&quot; + spitter.getUsername();    // 重定向到基本信息页
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们之前创建的 &lt;code&gt;showRegistrationForm()&lt;/code&gt; 方法依然还在，不过请注意新创建的 &lt;code&gt;processRegistration()&lt;/code&gt; 方法，它接受一个 Spitter 对象作为参数。这个对象有firstName、lastName、username 和 password 属性，这些属性将会使用请求中同名的参数进行填充。&lt;/p&gt;
&lt;p&gt;当使用 Spitter 对象调用 &lt;code&gt;processRegistration()&lt;/code&gt; 方法时，它会进而调用 SpitterRepository 的 &lt;code&gt;save()&lt;/code&gt; 方法，SpitterRepository 是在 SpitterController 的构造器中注入进来的。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;processRegistration()&lt;/code&gt; 方法做的最后一件事就是返回一个 String 类型，用来指定视图。但是这个视图格式和以前我们所看到的视图有所不同。这里不仅返回了视图的名称供视图解析器查找目标视图，而且返回的值还带有重定向的格式。&lt;/p&gt;
&lt;p&gt;当 InternalResourceViewResolver 看到视图格式中的 &lt;code&gt;redirect:&lt;/code&gt; 前缀时，它就知道要将其解析为重定向的规则，而不是视图的名称。在本例中，它将会重定向到用户基本信息的页面。例如，如果 Spitter.username 属性的值为&lt;code&gt;jbauer&lt;/code&gt;，那么视图将会重定向到 &lt;code&gt;/spitter/jbauer&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;需要注意的是，除 了 &lt;code&gt;redirect:&lt;/code&gt;，InternalResourceViewResolver 还能识别&lt;code&gt;forward:&lt;/code&gt; 前缀。当它发现视图格式中以 &lt;code&gt;forward:&lt;/code&gt; 作为前缀时，请求将会前往（forward）指定的 URL 路径，而不再是重定向。&lt;/p&gt;
&lt;p&gt;万事俱备！现在，&lt;code&gt;shouldProcessRegistration()&lt;/code&gt;的测试应该能够通过了。但是，我们的任务还没有完成，因为我们重定向到了用户基本信息页面，那么我们应该往 SpitterController 中添加一个处理器方法，用来处理对基本信息页面的请求。如下的 &lt;code&gt;showSpitterProfile()&lt;/code&gt; 将会完成这项任务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(value=&quot;/{username}&quot;, method=GET)
public String showSpitterProfile(@PathVariable String username, Model model) {
  Spitter spitter = spitterRepository.findByUsername(username);
  model.addAttribute(spitter);
  return &quot;profile&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SpitterRepository 通过用户名获取一个 Spitter 对象，&lt;code&gt;showSpitterProfile()&lt;/code&gt; 得到这个对象并将其添加到模型中，然后返回 profile，也就是基本信息页面的逻辑视图名。像本章展现的其他视图一样，现在的基本信息视图非常简单：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsonp&quot;&gt;&amp;lt;h1&amp;gt;Your Profile&amp;lt;/h1&amp;gt;
&amp;lt;c:out value=&quot;${spitter.username}&quot; /&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;c:out value=&quot;${spitter.firstName}&quot; /&amp;gt;
&amp;lt;c:out value=&quot;${spitter.lastName}&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果表单中没有发送 username 或 password 的话，会发生什么情况呢？或者说，如果 firstName 或 lastName 的值为空或太长的话，又会怎么样呢？接下来，让我们看一下如何为表单提交添加校验，从而避免数据呈现的不一致性。&lt;/p&gt;
&lt;p&gt;图 5.6 展现了在 Web 浏览器中渲染的基本信息页面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/b392d4b4-a72d-4ba6-b896-e9d48230e46c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;校验表单&lt;/h4&gt;
&lt;p&gt;如果用户在提交表单的时候，username 或 password 文本域为空的话，那么将会导致在新建 Spitter 对象中，username 或 password 是空的 String。至少这是一种怪异的行为。如果这种现象不处理的话，这将会出现安全问题，因为不管是谁只要提交一个空的表单就能登录应用。&lt;/p&gt;
&lt;p&gt;同时，我们还应该阻止用户提交空的 firstName 和 &lt;code&gt;/&lt;/code&gt; 或 lastName，使应用仅在一定程度上保持匿名性。有个好的办法就是限制这些输入域值的长度，保持它们的值在一个合理的长度范围，避免这些输入域的误用。&lt;/p&gt;
&lt;p&gt;有种处理校验的方式非常初级，那就是在 &lt;code&gt;processRegistration()&lt;/code&gt; 方法中添加代码来检查值的合法性，如果值不合法的话，就将注册表单重新显示给用户。这是一个很简短的方法，因此，添加一些额外的 if 语句也不是什么大问题，对吧？&lt;/p&gt;
&lt;p&gt;与其让校验逻辑弄乱我们的处理器方法，还不如使用 Spring 对 Java 校验 API（Java Validation API，又称 JSR-303）的支持。从 Spring 3.0 开 始，在 Spring MVC 中提供了对 Java 校验 API 的支持。在 Spring MVC 中要使用 Java 校验 API 的话，并不需要什么额外的配置。只要保证在类路径下包含这个 Java API 的实现即可，比如 Hibernate Validator。&lt;/p&gt;
&lt;p&gt;更新下&lt;code&gt;pom.xml&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;!-- https://mvnrepository.com/artifact/jakarta.validation/jakarta.validation-api --&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;jakarta.validation&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;jakarta.validation-api&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;3.0.1&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator --&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.hibernate.validator&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;hibernate-validator&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;7.0.4.Final&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Java 校验 API 定义了多个注解，这些注解可以放到属性上，从而限制这些属性的值。所有的注解都位于 jakarta.validation 包中。下图列出了这些校验注解。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/b19956b2-ef9c-4ef2-a9fe-26ec40d8e599.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;除了图中的注解，Java 校验 API 的实现可能还会提供额外的校验注解。同时，也可以定义自己的限制条件。但就我们来讲，将会关注于上表中的两个核心限制条件。&lt;/p&gt;
&lt;p&gt;请考虑要添加到 Spitter 域上的限制条件，似乎需要使用 @NotNull 和 @Size 注解。我们所要做的事情就是将这些注解添加到 Spitter 的属性上。如下的程序清单展现了 Spitter 类，它的属性已经添加了校验注解。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package syuez;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.hibernate.validator.constraints.Email;  // 已弃用

public class Spitter {

    private Long id;

    @NotNull
    @Size(min=5, max=16)
    private String username;

    @NotNull
    @Size(min=5, max=25)
    private String password;

    @NotNull
    @Size(min=2, max=30)
    private String firstName;

    @NotNull
    @Size(min=2, max=30)
    private String lastName;

    @NotNull
    @Email
    private String email;

    public Spitter() {}

    public Spitter(String username, String password, String firstName, String lastName, String email) {
        this(null, username, password, firstName, lastName, email);
    }

    public Spitter(Long id, String username, String password, String firstName, String lastName, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public boolean equals(Object that) {
        return EqualsBuilder.reflectionEquals(this, that, &quot;firstName&quot;, &quot;lastName&quot;, &quot;username&quot;, &quot;password&quot;, &quot;email&quot;);
    }

    @Override
    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this, &quot;firstName&quot;, &quot;lastName&quot;, &quot;username&quot;, &quot;password&quot;, &quot;email&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，Spitter 的所有属性都添加了 @NotNull 注解，以确保它们的值不为 null。类似地，属性上也添加了 @Size 注解以限制它们的长度在最大值和最小值之间。对 Spittr 应用来说，这意味着用户必须要填完注册表单，并且值的长度要在给定的范围内。&lt;/p&gt;
&lt;p&gt;我们已经为 Spitter 添加了校验注解，接下来需要修改 &lt;code&gt;processRegistration()&lt;/code&gt; 方法来应用校验功能。启用校验功能的 &lt;code&gt;processRegistration()&lt;/code&gt; 如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(value=&quot;/register&quot;, method=POST)
public String processRegistration(
        @Valid Spitter spitter,     // 校验 Spitter 输入
        Errors errors) {
    if (errors.hasErrors()) {
        return &quot;registerForm&quot;;   // 如果校验出现错误，则重新返回表单 
    }

    spitterRepository.save(spitter);
    return &quot;redirect:/spitter/&quot; + spitter.getUsername();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;与最初的 &lt;code&gt;processRegistration()&lt;/code&gt; 方法相比，这里有了很大的变化。Spitter 参数添加了 @Valid 注解，这会告知 Spring，需要确保这个对象满足校验限制。&lt;/p&gt;
&lt;p&gt;在 Spitter 属性上添加校验限制并不能阻止表单提交。即便用户没有填写某个域或者某个域所给定的值超出了最大长度，&lt;code&gt;processRegistration()&lt;/code&gt; 方法依然会被调用。这样，我们就需要处理校验的错误，就像在 &lt;code&gt;processRegistration()&lt;/code&gt; 方法中所看到的那样。&lt;/p&gt;
&lt;p&gt;如果有校验出现错误的话，那么这些错误可以通过 Errors 对象进行访问，现在这个对象已作为 &lt;code&gt;processRegistration()&lt;/code&gt; 方法的参数。（很重要一点需要注意，Errors 参数要紧跟在带有 @Valid 注解的参数后面，@Valid 注解所标注的就是要检验的参数。）&lt;code&gt;processRegistration()&lt;/code&gt; 方法所做的第一件事就是调用&lt;code&gt;Errors.hasErrors()&lt;/code&gt;来检查是否有错误。&lt;/p&gt;
&lt;p&gt;如果有错误的话，&lt;code&gt;Errors.hasErrors()&lt;/code&gt; 将会返回到registerForm，也就是注册表单的视图。这能够让用户的浏览器重新回到注册表单页面，所以他们能够修正错误，然后重新尝试提交。现在，会显示空的表单，但是在下一章中，我们将在表单中显示最初提交的值并将校验错误反馈给用户。&lt;/p&gt;
&lt;p&gt;如果没有错误的话，Spitter 对象将会通过 Repository 进行保存，控制器会像之前那样重定向到基本信息页面。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;a href=&quot;https://potoyang.gitbook.io/spring-in-action-v4/di-5-zhang-gou-jian-spring-web-ying-yong-cheng-xu/untitled-3&quot;&gt;5.4　处理表单 - Spring 实战(第四版) (gitbook.io)&lt;/a&gt; 有删改。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringMVC%E4%B9%8B%E5%A4%84%E7%90%86%E8%A1%A8%E5%8D%95.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringMVC%E4%B9%8B%E5%A4%84%E7%90%86%E8%A1%A8%E5%8D%95.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring MVC 之接受请求的输入</title>
            <description>
            &lt;!--
author: admin
date: 2022-05-17
title: Spring MVC 之接受请求的输入
tags: SpringMVC
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring MVC 之接受请求的输入&lt;/h1&gt;
&lt;p&gt;有些 Web 应用是只读的。人们只能通过浏览器在站点上闲逛，阅读服务器发送到浏览器中的内容。&lt;/p&gt;
&lt;p&gt;不过，这并不是一成不变的。众多的 Web 应用允许用户参与进去，将数据发送回服务器。如果没有这项能力的话，那 Web 将完全是另一番景象。&lt;/p&gt;
&lt;p&gt;Spring MVC 允许以多种方式将客户端中的数据传送到控制器的处理器方法中，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;查询参数（Query Parameter）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;表单参数（Form Parameter）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;路径变量（Path Variable）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作为开始，我们先看一下如何处理带有查询参数的请求，这也是客户端往服务器端发送数据时，最简单和最直接的方式。&lt;/p&gt;
&lt;h4&gt;处理查询参数&lt;/h4&gt;
&lt;p&gt;在 Spittr 应用中，我们可能需要处理的一件事就是展现分页的 Spittle 列表。在现在的 SpittleController 中，它只能展现最新的 Spittle，并没有办法向前翻页查看以前编写的 Spittle 历史记录。如果你想让用户每次都能查看某一页的 Spittle 历史，那么就需要提供一种方式让用户传递参数进来，进而确定要展现哪些 Spittle 集合。&lt;/p&gt;
&lt;p&gt;在确定该如何实现时，假设我们要查看某一页 Spittle 列表，这个列表会按照最新的 Spittle 在前的方式进行排序。因此，下一页中第一条的 ID 肯定会早于当前页最后一条的 ID。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/cf7be32a-304c-44c2-abe2-3a775157e77d.png=420x560&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;所以，为了显示下一页的 Spittle，我们需要将一个 Spittle 的 ID 传入进来，这个 ID 要恰好小于当前页最后一条 Spittle 的 ID。另外，你还可以传入一个参数来确定要展现的 Spittle 数量。&lt;/p&gt;
&lt;p&gt;为了实现这个分页的功能，我们所编写的处理器方法要接受如下的参 数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;before 参数（表明结果中所有 Spittle 的 ID 均应该在这个值之前）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;count 参数（表明在结果中要包含的 Spittle 数量）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了实现这个功能，我们将之前的 &lt;code&gt;spittles()&lt;/code&gt; 方法替换为使用 before 和 count 参数的新 &lt;code&gt;spittles()&lt;/code&gt; 方法。我们首先添加一个测试，这个测试反映了新 &lt;code&gt;spittles()&lt;/code&gt; 方法的功能。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Test
public void shouldShowPageSpittles() throws Exception {
    List&amp;lt;Spittle&amp;gt; expectedSpittles = createSpittleList(50);
    SpittleRepository mockRepository = mock(SpittleRepository.class);
    when(mockRepository.findSpittles(238900, 50))   // 预期的 max 和 count 参数
            .thenReturn(expectedSpittles);

    SpittleController controller = new SpittleController(mockRepository);
    MockMvc mockMvc = standaloneSetup(controller)
            .setSingleView(new InternalResourceView(&quot;/WEB-INF/views/spittles.jsp&quot;))
            .build();

    mockMvc.perform(get(&quot;/spittles?max=238900&amp;amp;count=50&quot;))   // 传入 max 和 count 参数
            .andExpect(view().name(&quot;spittles&quot;))
            .andExpect(model().attributeExists(&quot;spittleList&quot;))
            .andExpect(model().attribute(&quot;spittleList&quot;, hasItems(expectedSpittles.toArray())));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个测试方法和之前的测试方法关键区别在于它针对 &lt;code&gt;/spittles&lt;/code&gt; 发送 GET 请求，同时还传入了 max 和 count 参数。它测试了这些参数存在时的处理器方法，而之前的那个测试方法则测试了没有这些参数时的情景。这两个测试就绪后，我们就能确保不管控制器发生什么样的变化，它都能够处理这两种类型的请求：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(method=RequestMethod.GET)
public List&amp;lt;Spittle&amp;gt; spittles(
  @RequestParam(&quot;max&quot;) long max,
  @RequestParam(&quot;count&quot;) int count) {
    return spittleRepository.findSpittles(max, count);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SpittleController 中的处理器方法要同时处理有参数和没有参数的场景，那我们需要对其进行修改，让它能接受参数，同时，如果这些参数在请求中不存在的话，就使用默认值 Long.MAX_VALUE 和 20。@RequestParam 注解的default-Value 属性可以完成这项任务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(method=RequestMethod.GET)
public List&amp;lt;Spittle&amp;gt; spittles(
  @RequestParam(value=&quot;max&quot;, defaultValue=MAX_LONG_AS_STRING) long max,
  @RequestParam(value=&quot;count&quot;, defaultValue=&quot;20&quot;) int count) {
    return spittleRepository.findSpittles(max, count);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，如果 max 参数没有指定的话，它将会是 Long 类型的最大值。因为查询参数都是 String 类型的，因此 defaultValue 属性需要 String 类型的值。因此，使用 Long.MAX_VALUE 是不行的。我们可以将 Long.MAX_VALUE 转换为名为 MAX_LONG_AS_STRING 的 String 类型常量：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;private static final String MAX_LONG_AS_STRING = Long.toString(Long.MAX_VALUE);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;尽管 defaultValue 属性给定的是 String 类型的值，但是当绑定到方法的 max 参数时，它会转换为 Long 类型。&lt;/p&gt;
&lt;p&gt;如果请求中没有 count 参数的话，count 参数的默认值将会设置为 20。&lt;/p&gt;
&lt;p&gt;请求中的查询参数是往控制器中传递信息的常用手段。另外一种方式也很流行，尤其是在构建面向资源的控制器时，这种方式就是将传递参数作为请求路径的一部分。让我们看一下如何将路径变量作为请求路径的一部分，从而实现信息的输入。&lt;/p&gt;
&lt;h4&gt;通过路径参数接受输入&lt;/h4&gt;
&lt;p&gt;假设我们的应用程序需要根据给定的 ID 来展现某一个 Spittle 记录。其中一种方案就是编写处理器方法，通过使用 @RequestParam 注解，让它接受 ID 作为查询参数：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(value=&quot;/show&quot;, method=RequestMethod.GET)
public String showSpittles(
    @RequestParam(&quot;spittle_id&quot;) long spittleId, 
    Model model) {
  model.addAttribute(spittleRepository.findOne(spittleId));
  return &quot;spittle&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个处理器方法将会处理形如 &lt;code&gt;/spittles/show?spittle_id=12345&lt;/code&gt; 这样的请求。尽管这也可以正常工作，但是从面向资源的角度来看这并不理想。在理想情况下，要识别的资源（Spittle）应该通过 URL 路径进行标示，而不是通过查询参数。对 &lt;code&gt;/spittles/12345&lt;/code&gt; 发起 GET 请求要优于对 &lt;code&gt;/spittles/show?spittle_id=12345&lt;/code&gt; 发起请求。前者能够识别出要查询的资源，而后者描述的是带有参数的一个操作 —— 本质上是通过 HTTP 发起的 RPC 。&lt;/p&gt;
&lt;p&gt;既然已经以面向资源的控制器作为目标，那我们将这个需求转换为一 测试。以下展现了一个新的测试方法，它会断言 SpittleController中 对面向资源请求的处理。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Test
public void testSpittle() throws Exception {
    Spittle expectedSpittle = new Spittle(&quot;Hello&quot;, new Date());
    SpittleRepository mockRepository = mock(SpittleRepository.class);
    when(mockRepository.findOne(12345)).thenReturn(expectedSpittle);

    SpittleController controller = new SpittleController(mockRepository);
    MockMvc mockMvc = standaloneSetup(controller).build();

    mockMvc.perform(get(&quot;/spittles/12345&quot;))     // 通过路径请求资源
            .andExpect(view().name(&quot;spittle&quot;))
            .andExpect(model().attributeExists(&quot;spittle&quot;))
            .andExpect(model().attribute(&quot;spittle&quot;, expectedSpittle));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，这个测试构建了一个 mock Repository、一个控制器和 MockMvc，这与本章中我们所编写的其他测试很类似。这个测试中最重要的部分是最后几行，它对 &lt;code&gt;/spittles/12345&lt;/code&gt; 发起 GET 请求，然后断言视图的名称是 spittle，并且预期的 Spittle 对象放到了模型之中。因为我们还没有为这种请求实现处理器方法，因此这个请求将会失败。但是，我们可以通过为 SpittleController 添加新的方法来修正这个失败的测试。&lt;/p&gt;
&lt;p&gt;到目前为止，在我们编写的控制器中，所有的方法都映射到了（通过 @RequestMapping）静态定义好的路径上。但是，如果想让这个测试通过的话，我们编写的 @RequestMapping 要包含变量部分，这部分代表了 Spittle ID。&lt;/p&gt;
&lt;p&gt;为了实现这种路径变量，Spring MVC 允许我们在 @RequestMapping 路径中添加占位符。占位符的名称要用大括号（&lt;code&gt;{&lt;/code&gt; 和 &lt;code&gt;}&lt;/code&gt;）括起来。路径中的其他部分要与所处理的请求完全匹配，但是占位符部分可以是任意的值。&lt;/p&gt;
&lt;p&gt;下面的处理器方法使用了占位符，将 Spittle ID 作为路径的一部 分：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(value=&quot;/{spittleId}&quot;, method=RequestMethod.GET)
public String spittle(
    @PathVariable(&quot;spittleId&quot;) long spittleId, 
    Model model) {
  model.addAttribute(spittleRepository.findOne(spittleId));
  return &quot;spittle&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如，它就能够处理针对 &lt;code&gt;/spittles/12345&lt;/code&gt; 的请求，也就是程序清单 5.12 中的路径我们可以看到，&lt;code&gt;spittle()&lt;/code&gt; 方法的 spittleId 参数上添加了 @Path-Variable(&amp;quot;spittleId&amp;quot;) 注解，这表明在请求路径中，不管占位符部分的值是什么都会传递到处理器方法的 spittleId 参数中。如果对 &lt;code&gt;/spittles/54321&lt;/code&gt; 发送 GET 请求，那么将会把 &lt;code&gt;54321&lt;/code&gt; 传递进来，作为 spittleId 的值。&lt;/p&gt;
&lt;p&gt;需要注意的是：在样例中 spittleId 这个词出现了好几次：先是在@Request-Mapping 的路径中，然后作为 @PathVariable 属性的值，最后又作为方法的参数名称。因为方法的参数名碰巧与占位符的名称相同，因此我们可以去掉 @PathVariable 中的 value 属性：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(value=&quot;/{spittleId}&quot;, method=RequestMethod.GET)
public String spittle(@PathVariable long spittleId, Model model) {
  model.addAttribute(spittleRepository.findOne(spittleId));
  return &quot;spittle&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果 @PathVariable 中没有 value 属性的话，它会假设占位符的名称与方法的参数名相同。这能够让代码稍微简洁一些，因为不必重复写占位符的名称了。但需要注意的是，如果你想要重命名参数时，必须要同时修改占位符的名称，使其互相匹配。&lt;/p&gt;
&lt;p&gt;spittle() 方法会将参数传递到 SpittleRepository 的 &lt;code&gt;findOne()&lt;/code&gt; 方法中，用来获取某个 Spittle 对象，然后将 Spittle 对象添加到模型中。模型的 key 将会是 spittle，这是根据传递到 &lt;code&gt;addAttribute()&lt;/code&gt; 方法中的类型推断得到的。&lt;/p&gt;
&lt;p&gt;这样 Spittle 对象中的数据就可以渲染到视图中了，此时需要引用请求中 key 为 spittle 的属性（与模型的 key 一致）。如下为渲染 Spittle 的 JSP 视图片段：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsonp&quot;&gt;&amp;lt;div class=&quot;spittleViwe&quot;&amp;gt;
  &amp;lt;div class=&quot;spittleMessage&quot;&amp;gt;
    &amp;lt;c:out value=&quot;${spittle.message}&quot; /&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;span class=&quot;spittleTime&quot;&amp;gt;
      &amp;lt;c:out value=&quot;${spittle.time}&quot; /&amp;gt;
    &amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个视图并没有什么特别之处，它的屏幕截图如图 5.4 所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/4b512015-934d-4f50-a4f7-b40fed92a89e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果传递请求中少量的数据，那查询参数和路径变量是很合适的。但通常我们还需要传递很多的数据（也许是表单提交的数据），那查询参数显得有些笨拙和受限了。下面让我们来看一下如何编写控制器方法来处理表单提交。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;a href=&quot;https://potoyang.gitbook.io/spring-in-action-v4/di-5-zhang-gou-jian-spring-web-ying-yong-cheng-xu/untitled-2&quot;&gt;5.3　接受请求的输入 - Spring 实战(第四版) (gitbook.io)&lt;/a&gt; 有删改。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringMVC%E4%B9%8B%E6%8E%A5%E5%8F%97%E8%AF%B7%E6%B1%82%E7%9A%84%E8%BE%93%E5%85%A5.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringMVC%E4%B9%8B%E6%8E%A5%E5%8F%97%E8%AF%B7%E6%B1%82%E7%9A%84%E8%BE%93%E5%85%A5.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring MVC 之传递模型数据到视图中</title>
            <description>
            &lt;!--
author: admin
date: 2022-05-16
title: Spring MVC 之传递模型数据到视图中
tags: SpringMVC
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring MVC 之传递模型数据到视图中&lt;/h1&gt;
&lt;p&gt;在 《Spring MVC 起步》中，就编写超级简单的控制器来说，HomeController 已经是一个不错的样例了。但是大多数的控制器并不是这么简单。在 Spittr 应用中，我们需要有一个页面展现最近提交的 Spittle 列表。因此，我们需要一个新的方法来处理这个页面。&lt;/p&gt;
&lt;p&gt;首先，需要定义一个数据访问的 Repository。为了实现解耦以及避免陷入数据库访问的细节之中，我们将 Repository 定义为一个接口，并在之后的《 Spring 和 JDBC 》实现它。此时，我们只需要一个能够获取 Spittle 列表的 Repository，如下所示的 SpittleRepository 功能已经足够了：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package syuez.data;

import java.util.List;

import syuez.Spittle;

public interface SpittleRepository {

    List&amp;lt;Spittle&amp;gt; findSpittles(long max, int count);

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，我们让 Spittle 类尽可能的简单，如下面的程序清单 5.8 所示。它的属性包括消息内容、时间戳以及 Spittle 发布时对应的经纬度。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package syuez;

import java.util.Date;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

public class Spittle {

    private final Long id;
    private final String message;
    private final Date time;
    private Double latitude;
    private Double longitude;

    public Spittle(String message, Date time) {
        this(null, message, time, null, null);
    }

    public Spittle(Long id, String message, Date time, Double longitude, Double latitude) {
        this.id = id;
        this.message = message;
        this.time = time;
        this.longitude = longitude;
        this.latitude = latitude;
    }

    public long getId() {
        return id;
    }

    public String getMessage() {
        return message;
    }

    public Date getTime() {
        return time;
    }

    public Double getLongitude() {
        return longitude;
    }

    public Double getLatitude() {
        return latitude;
    }

    @Override
    public boolean equals(Object that) {
        return EqualsBuilder.reflectionEquals(this, that, &quot;id&quot;, &quot;time&quot;);
    }

    @Override
    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this, &quot;id&quot;, &quot;time&quot;);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就大部分内容来看，Spittle 就是一个基本的 POJO 数据对象 —— 没有什么复杂的。唯一要注意的是，我们使用 Apache Common Lang 包来实现 equals() 和 hashCode() 方法。这些方法除了常规的作用以外，当我们为控制器的处理器方法编写测试时，它们也是有用的。&lt;/p&gt;
&lt;p&gt;既然我们说到了测试，那么我们继续讨论这个话题并为新的控制器方法编写测试。如下的程序清单使用 Spring 的 MockMvc 来断言新的处理器方法中你所期望的行为。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static org.hamcrest.Matchers.*;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.junit.Test;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.servlet.view.InternalResourceView;

import syuez.Spittle;
import syuez.data.SpittleRepository;
import syuez.web.SpittleController;

public class SpittleControllerTest {
    @Test
    public void shouldShowRecentSpittles() throws Exception {
        List&amp;lt;Spittle&amp;gt; expectedSpittles = createSpittleList(20); // 模拟创建 20个 Spittle
        SpittleRepository mockRepository = mock(SpittleRepository.class); // Mock Repository
        when(mockRepository.findSpittles(Long.MAX_VALUE, 20))
                .thenReturn(expectedSpittles);

        SpittleController controller = new SpittleController(mockRepository);
        MockMvc mockMvc = standaloneSetup(controller)   // Mock Spring MVC
                .setSingleView(new InternalResourceView(&quot;/WEB-INF/views/spittles.jsp&quot;))
                .build();

        mockMvc.perform(get(&quot;/spittles&quot;))   // 对 &quot;/spittles&quot; 发起 GET 请求
                .andExpect(view().name(&quot;spittles&quot;))
                .andExpect(model().attributeExists(&quot;spittleList&quot;))
                .andExpect(model().attribute(&quot;spittleList&quot;,     // 断言期望的值
                        hasItems(expectedSpittles.toArray())));
    }

    private List&amp;lt;Spittle&amp;gt; createSpittleList(int count) {
        List&amp;lt;Spittle&amp;gt; spittles = new ArrayList&amp;lt;Spittle&amp;gt;();
        for (int i=0; i &amp;lt; count; i++) {
            spittles.add(new Spittle(&quot;Spittle &quot; + i, new Date()));
        }
        return spittles;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个测试首先会创建 SpittleRepository 接口的 mock 实现，这个实现会从它的 &lt;code&gt;findSpittles()&lt;/code&gt; 方法中返回 20 个 Spittle 对象。然后，它将这个 Repository 注入到一个新的 SpittleController 实例中，然后创建 MockMvc 并使用这个控制器。&lt;/p&gt;
&lt;p&gt;需要注意的是，与 HomeController 不同，这个测试在 MockMvc 构造器上调用了 &lt;code&gt;setSingleView()&lt;/code&gt;。这样的话，mock 框架就不用解析控制器中的视图名了。在很多场景中，其实没有必要这样做。但是对于这个控制器方法，视图名与请求路径是非常相似的，这样按照默认的视图解析规则时，MockMvc 就会发生失败，因为无法区分视图路径和控制器的路径。在这个测试中，构建 Internal-ResourceView 时所设置的实际路径是无关紧要的，但我们将其设置为与InternalResourceViewResolver 配置一致。&lt;/p&gt;
&lt;p&gt;因为需要用到很多新的依赖，所以 &lt;code&gt;pom.xml&lt;/code&gt;也需要更新下了：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;commons-lang3&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;3.12.0&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;!-- https://mvnrepository.com/artifact/org.mockito/mockito-core --&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.mockito&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;mockito-core&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;4.5.1&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest --&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.hamcrest&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;hamcrest&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;2.2&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;4.13.2&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;!-- https://mvnrepository.com/artifact/javax.servlet/jstl --&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;!-- https://mvnrepository.com/artifact/com.h2database/h2 --&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;com.h2database&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;h2&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;2.1.212&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后测试对 &lt;code&gt;/spittles&lt;/code&gt; 发起 GET 请求，然后断言视图的名称为 spittles 并且模型中包含名为 spittleList 的属性，在 spittleList 中包含预期的内容。 当然，如果此时运行测试的话，它将会失败。它不是运行失败，而是在编译的时候就会失败。这是因为我们还没有编写 SpittleController。现在，我们创建Spittle-Controller ：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package syuez.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import syuez.data.SpittleRepository;

@Controller
@RequestMapping(&quot;/spittles&quot;)
public class SpittleController {

    private SpittleRepository spittleRepository;

    // 注入 spittleRepository
    @Autowired
    public SpittleController(SpittleRepository spittleRepository) {
        this.spittleRepository = spittleRepository;
    }

    @RequestMapping(method=RequestMethod.GET)
    public String spittles(Model model) {
        // 将 spittle 添加到模型中
        model.addAttribute(
                spittleRepository.findSpittles(Long.MAX_VALUE, 20)
        );
        return &quot;spittles&quot;;  // 返回视图名
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以看到 SpittleController 有一个构造器，这个构造器使用了 @Autowired 注解，用来注入 SpittleRepository。这个 SpittleRepository 随后又用在 &lt;code&gt;spittles()&lt;/code&gt; 方法中，用来获取最新的 spittle 列表。&lt;/p&gt;
&lt;p&gt;需要注意的是，我们在 &lt;code&gt;spittles()&lt;/code&gt; 方法中给定了一个 Model 作为参数。这样，&lt;code&gt;spittles()&lt;/code&gt; 方法就能将 Repository 中获取到的 Spittle 列表填充到模型中。Model 实际上就是一个 Map（也就是 key-value 对的集合），它会传递给视图，这样数据就能渲染到客户端了。当调用 &lt;code&gt;addAttribute()&lt;/code&gt; 方法并且不指定 key 的时候，那么 key 会根据值的对象类型推断确定。在本例中，因为它是一个 &lt;code&gt;List&amp;lt;Spittle&amp;gt;&lt;/code&gt;，因此，键将会推断为 spittleList 。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;spittles()&lt;/code&gt; 方法所做的最后一件事是返回 spittles 作为视图的名字，这个视图会渲染模型。&lt;/p&gt;
&lt;p&gt;如果你希望显式声明模型的 key 的话，那也尽可以进行指定。例如，下面这个版本的 &lt;code&gt;spittles()&lt;/code&gt; 方法效果一样：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(method=RequestMethod.GET)
public String spittles(Model model) {
  model.addAttribute(&quot;splittleList&quot;,
    spittleRepository.findSpittles(Long.MAX_VALUE, 20)
  );
  return &quot;spittles&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你希望使用非 Spring 类型的话，那么可以用 java.util.Map 来代替 Model。下面这个版本的 &lt;code&gt;spittles()&lt;/code&gt; 方法与之前的版本在功能上是一样的：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(method=RequestMethod.GET)
public String spittles(Map model) {
  model.put(&quot;splittleList&quot;,
    spittleRepository.findSpittles(Long.MAX_VALUE, 20)
  );
  return &quot;spittles&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;既然我们现在提到了各种可替代的方案，那下面还有另外一种方式来编写&lt;code&gt;spittles()&lt;/code&gt; 方法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@RequestMapping(method=RequestMethod.GET)
public List&amp;lt;Spittle&amp;gt; spittles() {
  return spittleRepository.findSpittles(Long.MAX_VALUE, 20);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个版本与其他的版本有些差别。它并没有返回视图名称，也没有显式地设定模型，这个方法返回的是 Spittle 列表。当处理器方法像这样返回对象或集合时，这个值会放到模型中，模型的 key 会根据其类型推断得出（在本例中，也就是 spittleList）。&lt;/p&gt;
&lt;p&gt;而逻辑视图的名称将会根据请求路径推断得出。因为这个方法处理针对 &lt;code&gt;/spittles&lt;/code&gt; 的 GET 请求，因此视图的名称将会是 spittles（去掉开头的斜线）。&lt;/p&gt;
&lt;p&gt;不管你选择哪种方式来编写 &lt;code&gt;spittles()&lt;/code&gt; 方法，所达成的结果都是相同的。模型中会存储一个 Spittle 列表，key 为 spittleList，然后这个列表会发送到名为 spittles 的视图中。按照我们配置 InternalResourceViewResolver 的方式，视图的 JSP 将会是 &lt;code&gt;/WEB-INF/views/spittles.jsp&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;现在，数据已经放到了模型中，在 JSP 中该如何访问它呢？实际上，当视图是 JSP 的时候，模型数据会作为请求属性放到请求（request）之中。因此，在 spittles.jsp 文件中可以使用 JSTL（JavaServer Pages Standard Tag Library）的 &lt;code&gt;&amp;lt;c:forEach&amp;gt;&lt;/code&gt; 标签渲染 spittle 列表：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsonp&quot;&gt;&amp;lt;c:forEach items=&quot;${spittleList}&quot; var=&quot;spittle&quot; &amp;gt;
  &amp;lt;li id=&quot;spittle_&amp;lt;c:out value=&quot;spittle.id&quot;/&amp;gt;&quot;&amp;gt;
    &amp;lt;div class=&quot;spittleMessage&quot;&amp;gt;
      &amp;lt;c:out value=&quot;${spittle.message}&quot; /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;span class=&quot;spittleTime&quot;&amp;gt;
        &amp;lt;c:out value=&quot;${spittle.time}&quot; /&amp;gt;
      &amp;lt;/span&amp;gt;
      &amp;lt;span class=&quot;spittleLocation&quot;&amp;gt;(
        &amp;lt;c:out value=&quot;${spittle.latitude}&quot; /&amp;gt;, 
        &amp;lt;c:out value=&quot;${spittle.longitude}&quot; /&amp;gt;)
      &amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/li&amp;gt;
&amp;lt;/c:forEach&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;图 5.3 为显示效果，能够让你对它在 Web 浏览器中是什么样子有个可视化的印象。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/00b04c91-fd1b-4a5a-971a-a03f6ec93f61.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;由于我们这里没有实现 SpittleRepository ，不能在浏览器中访问。&lt;/p&gt;
&lt;p&gt;PS.   JUnit + Mockito 单元测试之打桩&lt;code&gt;when().thenReturn();&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在上面的测试代码中：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;when(mockRepository.findSpittles(Long.MAX_VALUE, 20))
                .thenReturn(expectedSpittles);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里来简单聊下：&lt;/p&gt;
&lt;p&gt;Mock 测试就是在测试过程中，对于某些不容易构造（如 HttpServletRequest 必须在Servlet 容器中才能构造出来）或者不容易获取的对象（如 JDBC 中的 ResultSet 对象, JPA 的 CRUDRepository ,需要执行数据库操作的），用一个虚拟的对象（Mock 对象）来创建（覆盖方法返回）以便测试的测试方法。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;when(xxxx).thenReturn(yyyy);&lt;/code&gt;是指定当执行了这个方法的时候，返回 thenReturn 的值，相当于是对模拟对象的配置过程，为某些条件给定一个预期的返回值。&lt;/p&gt;
&lt;p&gt;Mockito 中 &lt;code&gt;when().thenReturn();&lt;/code&gt; 这种语法来定义对象方法和参数（输入），然后在 thenReturn 中指定结果（输出）。此过程称为 &lt;strong&gt;Stub 打桩&lt;/strong&gt; 。一旦这个方法被 stub 了，就会一直返回这个 stub 的值。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;文本来源：&lt;a href=&quot;https://potoyang.gitbook.io/spring-in-action-v4/di-5-zhang-gou-jian-spring-web-ying-yong-cheng-xu/untitled-4/untitled&quot;&gt;5.2.3　传递模型数据到视图中 - Spring 实战(第四版) (gitbook.io)&lt;/a&gt; 有删改。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/moshowgame/article/details/100983711&quot;&gt;JUnit+Mockito单元测试之打桩when().thenReturn();_Moshow郑锴的博客-CSDN博客_thenreturn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/lyy-2016/p/6122144.html&quot;&gt;SpringMVC 测试 mockMVC - LittleMoon - 博客园 (cnblogs.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringMVC%E4%B9%8B%E4%BC%A0%E9%80%92%E6%A8%A1%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%88%B0%E8%A7%86%E5%9B%BE%E4%B8%AD.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringMVC%E4%B9%8B%E4%BC%A0%E9%80%92%E6%A8%A1%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%88%B0%E8%A7%86%E5%9B%BE%E4%B8%AD.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring MVC起步</title>
            <description>
            &lt;!--
author: admin
date: 2022-05-11
title: Spring MVC起步
tags: SpringMVC
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring MVC起步&lt;/h1&gt;
&lt;p&gt;前面几篇文章学习了 Spring Core，接下来学习下 Java Web 中的大头 Spring MVC。&lt;/p&gt;
&lt;p&gt;对于很多 Java 开发人员来说，基于 Web 的应用程序是他们主要的关注点。如果你有这方面经验的话，你会意识到这种系统所面临的挑战。具体来讲，状态管理、工作流以及验证都是需要解决的重要特性。HTTP 协议的无状态性决定了这些问题都不那么容易解决。&lt;/p&gt;
&lt;p&gt;Spring 的 Web 框架就是为了帮你解决这些关注点而设计的。Spring MVC 基于&lt;strong&gt;模型-视图-控制器&lt;/strong&gt;（Model-View-Controller，MVC）模式实现，它能够帮你构建像 Spring 框架那样灵活和松耦合的 Web 应用程序。&lt;/p&gt;
&lt;p&gt;从现在开始我们将会介绍 Spring MVC Web 框架，并使用新的 Spring MVC 注解来构建处理各种 Web 请求、参数和表单输入的控制器。在深入介绍 Spring MVC 之前，让我们先总体上介绍一下 Spring MVC，并建立起 Spring MVC 运行的基本配置。&lt;/p&gt;
&lt;h4&gt;跟踪 Spring MVC 的请求&lt;/h4&gt;
&lt;p&gt;每当用户在 Web 浏览器中点击链接或提交表单的时候，请求就开始工作了。对请求的工作描述就像是快递投送员。与邮局投递员或 FedEx 投送员一样，请求会将信息从一个地方带到另一个地方。&lt;/p&gt;
&lt;p&gt;请求是一个十分繁忙的家伙。从离开浏览器开始到获取响应返回，它会经历好多站，在每站都会留下一些信息同时也会带上其他信息。图 5.1 展示了请求使用 Spring MVC 所经历的所有站点。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/868a54c7-143c-424b-b818-67a638dc725f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在请求离开浏览器时①，会带有用户所请求内容的信息，至少会包含请求的 URL。但是还可能带有其他的信息，例如用户提交的表单信息。&lt;/p&gt;
&lt;p&gt;请求旅程的第一站是 Spring 的 &lt;code&gt;DispatcherServlet&lt;/code&gt;。与大多数基于 Java 的 Web 框架一样，Spring MVC 所有的请求都会通过一个前端控制器（front controller）Servlet。前端控制器是常用的 Web 应用程序模式，在这里一个单实例的 Servlet 将请求委托给应用程序的其他组件来执行实际的处理。在 Spring MVC 中，&lt;strong&gt;DispatcherServlet 就是前端控制器&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;DispatcherServlet 的任务是将请求发送给 Spring MVC 控制器 （controller）。控制器是一个用于处理请求的 Spring 组件。在典型的应用程序中可能会有多个控制器，DispatcherServlet 需要知道应该将请求发送给哪个控制器。所以 DispatcherServlet 以会查询一个或多个&lt;strong&gt;处理器映射&lt;/strong&gt;（&lt;code&gt;handler mapping&lt;/code&gt;）② 来确定请求的下一站在哪里。处理器映射会根据请求所携带的 URL 信息来进行决策。&lt;/p&gt;
&lt;p&gt;一旦选择了合适的&lt;strong&gt;控制器&lt;/strong&gt;，DispatcherServlet 会将请求发送给选中的控制器③。到了控制器，请求会卸下其负载（用户提交的信息）并耐心等待控制器处理这些信息。（实际上，设计良好的控制器本身只处理很少甚至不处理工作，而是将业务逻辑委托给一个或多个服务对象进行处理。）&lt;/p&gt;
&lt;p&gt;控制器在完成逻辑处理后，通常会产生一些信息，这些信息需要返回给用户并在浏览器上显示。这些信息被称为&lt;strong&gt;模型&lt;/strong&gt;（&lt;code&gt;model&lt;/code&gt;）。不过仅仅给用户返回原始的信息是不够的 —— 这些信息需要以用户友好的方式进行格式化，一般会是 HTML。所以，信息需要发送给一个视图 （view），通常会是 JSP。&lt;/p&gt;
&lt;p&gt;控制器所做的最后一件事就是将模型数据打包，并且标示出用于渲染输出的视图名。它接下来会将请求连同&lt;strong&gt;模型和视图名&lt;/strong&gt;发送回 DispatcherServlet ④。&lt;/p&gt;
&lt;p&gt;这样，控制器就不会与特定的视图相耦合，传递给 DispatcherServlet 的视图名并不直接表示某个特定的 JSP。实际上，它甚至并不能确定视图就是 JSP。相反，它仅仅传递了一个逻辑名称，这个名字将会用来查找产生结果的真正视图。DispatcherServlet 将会使用&lt;strong&gt;视图解析器&lt;/strong&gt;（&lt;code&gt;view resolver&lt;/code&gt;）⑤ 来将逻辑视图名匹配为一个特定的视图实现，它可能是也可能不是 JSP。&lt;/p&gt;
&lt;p&gt;既然 DispatcherServlet 已经知道由哪个视图渲染结果，那请求的任务基本上也就完成了。它的最后一站是&lt;strong&gt;视图&lt;/strong&gt;的实现（可能是 JSP）⑥，在这里它交付模型数据。请求的任务就完成了。视图将使用模型数据渲染输出，这个输出会通过响应对象传递给客户端（不会像听上去那样硬编码）⑦ 。&lt;/p&gt;
&lt;p&gt;可以看到，请求要经过很多的步骤，最终才能形成返回给客户端的响应。大多数的步骤都是在 Spring 框架内部完成的，也就是图 5.1 所示的组件中。尽管这里的主要内容都关注于如何编写控制器，但在此之前我们首先看一下如何搭建 Spring MVC 的基础组件。&lt;/p&gt;
&lt;h4&gt;搭建 Spring MVC&lt;/h4&gt;
&lt;p&gt;从 iDEA 新建 Maven 项目：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/8f622f9e-d185-4468-8e7a-3c695d44a554.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;pom.xml&lt;/code&gt;中添加依赖：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;  &amp;lt;properties&amp;gt;
    &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
    &amp;lt;maven.compiler.source&amp;gt;1.7&amp;lt;/maven.compiler.source&amp;gt;
    &amp;lt;maven.compiler.target&amp;gt;1.7&amp;lt;/maven.compiler.target&amp;gt;
    &amp;lt;spring.version&amp;gt;5.3.19&amp;lt;/spring.version&amp;gt;
  &amp;lt;/properties&amp;gt;

  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;4.13.2&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;src\main&lt;/code&gt;目录下添加 java 目录和 resources 目录，在&lt;code&gt;src\webapp&lt;/code&gt;目录下添加 resources 目录。&lt;/p&gt;
&lt;p&gt;这样大致的环境已经搭建好了。&lt;/p&gt;
&lt;p&gt;基于图 5.1，看上去我们需要配置很多的组成部分。幸好，借助于最近几个 Spring 新版本的功能增强，开始使用 Spring MVC 变得非常简单了。现在，我们要使用最简单的方式来配置 Spring MVC：所要实现的功能仅限于运行我们所创建的控制器。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置 DispatcherServlet&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DispatcherServlet 是 Spring MVC 的核心。在这里请求会第一次接触到框架，它要负责将请求路由到其他的组件之中。&lt;/p&gt;
&lt;p&gt;按照传统的方式，像 DispatcherServlet 这样的 Servlet 会配置在 web.xml 文件中，这个文件会放到应用的 WAR 包里面。当然，这是配置 DispatcherServlet 的方法之一。但是，借助于 Servlet 3 规范和 Spring 3.1 的功能增强，这种方式已经不是唯一的方案了，这也不是我们这次所使用的配置方法。&lt;/p&gt;
&lt;p&gt;我们会使用 Java 将 DispatcherServlet 配置在 Servlet 容器中，而不会再使用 web.xml 文件。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package syuez.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    /**
     * getServletMappings() 会将一个或者多个路径映射到 DispatcherServlet 上
     * 本例中它映射的是 &quot;/&quot; ，这表示它会是应用默认的 Servlet，它会处理进入应用的所有请求
     */
    @Override
    protected String[] getServletMappings() {
        return new String[] { &quot;/&quot; };    // 将 DispatcherServlet 映射到 &quot;/&quot;
    }

    @Override
    protected Class&amp;lt;?&amp;gt;[] getRootConfigClasses() {
        return new Class&amp;lt;?&amp;gt;[] { RootConfig.class };
    }

    @Override
    protected Class&amp;lt;?&amp;gt;[] getServletConfigClasses() {
        return new Class&amp;lt;?&amp;gt;[] { WebConfig.class };  // 指定配置类
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里我们在 java 目录新建了软件包 syuez 并进一步创建了用于存放配置的 config 目录。上面这个类的名字是 SpittrWebAppInitializer，它位于名为 syuez.config 的包中。稍后会对其进行介绍，但现在，你只需要知道我们所要创建的应用名为 Spittr。&lt;/p&gt;
&lt;p&gt;要理解&lt;code&gt;SpittrWebAppInitializer&lt;/code&gt;类是如何工作的，我们可能只需要知道扩展 AbstractAnnotationConfigDispatcherServletInitializer 的任意类都会自动地配置 DispatcherServlet 和 Spring 应用上下文，Spring 的应用上下文会位于应用程序的 Servlet 上下文之中。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AbstractAnnotationConfigDispatcherServletInitializer 剖析&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 Servlet 3.0 环境中，容器会在类路径中查找实现 javax.servlet.ServletContainerInitializer 接口的类， 如果能发现的话，就会用它来配置 Servlet 容器。&lt;/p&gt;
&lt;p&gt;Spring 提供了这个接口的实现，名为 SpringServletContainerInitializer，这个类反过来又会查找实现 WebApplicationInitializer 的类并将配置的任务交给它们来完成。Spring 3.2 引入了一个便利的 WebApplicationInitializer 基础实现，也就是 AbstractAnnotationConfigDispatcherServletInitializer 因为我们的 SpittrWebAppInitializer 扩展了 AbstractAnnotationConfigDispatcherServletInitializer（同时也就实现了 WebApplicationInitializer），因此当部署到 Servlet 3.0 容器中的时候，容器会自动发现它，并用它来配置 Servlet 上下文。&lt;/p&gt;
&lt;p&gt;尽管它的名字很长，但是 AbstractAnnotationConfigDispatcherServletInitializer 使用起来很简便。SpittrWebAppInitializer 重写了三个方法。&lt;/p&gt;
&lt;p&gt;第一个方法是 &lt;code&gt;getServletMappings()&lt;/code&gt;，它会将一个或多个路径映射到 Dispatcher-Servlet上。在本例中，它映射的是 &lt;code&gt;&quot;/&quot;&lt;/code&gt;，这表示它会是应用的默认 Servlet。它会处理进入应用的所有请求。&lt;/p&gt;
&lt;p&gt;为了理解其他的两个方法，我们首先要理解 DispatcherServlet 和一个 Servlet 监听器（也就是 ContextLoaderListener）的关系。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;两个应用上下文之间的故事&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当 DispatcherServlet 启动的时候，它会创建 Spring 应用上下文，并加载配置文件或配置类中所声明的 bean。在以上程序中的 &lt;code&gt;getServletConfigClasses()&lt;/code&gt; 方法中，我们要求 DispatcherServlet 加载应用上下文时，使用定义在 WebConfig 配置类（使用 Java 配置）中的 bean。&lt;/p&gt;
&lt;p&gt;但是在 Spring Web 应用中，通常还会有另外一个应用上下文。另外的这个应用上下文是由 ContextLoaderListener 创建的。&lt;/p&gt;
&lt;p&gt;我们希望 DispatcherServlet 加载包含 Web 组件的 bean，如控制器、视图解析器以及处理器映射，而 ContextLoaderListener 要加载应用中的其他 bean。这些 bean 通常是驱动应用后端的中间层和数据层组件。&lt;/p&gt;
&lt;p&gt;实际上，AbstractAnnotationConfigDispatcherServletInitializer 会同时创建 DispatcherServlet 和 ContextLoaderListener。&lt;code&gt;GetServletConfigClasses()&lt;/code&gt; 方法返回的带有 @Configuration 注解的类将会用来定义 DispatcherServlet 应用上下文中的 bean。&lt;code&gt;getRootConfigClasses()&lt;/code&gt; 方法返回的带有 @Configuration 注解的类将会用来配置 ContextLoaderListener 创建的应用上下文中的 bean。&lt;/p&gt;
&lt;p&gt;在本例中，根配置定义在 RootConfig 中，DispatcherServlet 的配置声明在 WebConfig 中。稍后我们将会看到这两个类的内容。&lt;/p&gt;
&lt;p&gt;需要注意的是，通过 AbstractAnnotationConfigDispatcherServletInitializer 来配置 DispatcherServlet 是传统 web.xml 方式的替代方案。如果你愿意的话，可以同时包含 web.xml 和 AbstractAnnotationConfigDispatcherServletInitializer，但这其实并没有必要。&lt;/p&gt;
&lt;p&gt;如果按照这种方式配置 DispatcherServlet，而不是使用 web.xml 的话，那唯一问题在于它只能部署到支持 Servlet 3.0 的服务器中才能正常工作，如 Tomcat 7 或更高版本。Servlet 3.0 规范在 2009 年 12 月份就发布了，因此很有可能你会将应用部署到支持 Servlet 3.0 的 Servlet 容器之中。如果你还没有使用支持 Servlet 3.0 的服务器，那么在 AbstractAnnotationConfigDispatcherServletInitializer 子类中配置 DispatcherServlet 的方法就不适合你了。你别无选择，只能使用 web.xml 了。&lt;/p&gt;
&lt;p&gt;现在，我们先看一下以上程序中所引用的 WebConfig 和 RootConfig，了解一下如何启用 Spring MVC。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;启用 Spring MVC&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们有多种方式来配置 DispatcherServlet，与之类似，启用 Spring MVC 组件的方法也不仅一种。以前，Spring 是使用 XML 进行配置的，不过，现在我们会让 Spring MVC 的搭建过程尽可能简单并基于 Java 进行配置。&lt;/p&gt;
&lt;p&gt;我们所能创建的最简单的 Spring MVC 配置就是一个带有 @EnableWebMvc 注解的类：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package syuez.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@EnableWebMvc
public class WebConfig {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这可以运行起来，它的确能够启用 Spring MVC，但还有不少问题要解决：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;没有配置视图解析器。如果这样的话，Spring 默认会使用 BeanNameViewResolver，这个视图解析器会查找 ID 与视图名称匹配的 bean，并且查找的 bean 要实现 View 接口，它以这样的方式来解析视图。&lt;/li&gt;
&lt;li&gt;没有启用组件扫描。这样的结果就是，Spring 只能找到显式声明在配置类中的控制器。&lt;/li&gt;
&lt;li&gt;这样配置的话，DispatcherServlet 会映射为应用的默认 Servlet，所以它会处理所有的请求，包括对静态资源的请求，如图片和样式表（在大多数情况下，这可能并不是你想要的效果）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，我们需要在 WebConfig 这个最小的 Spring MVC 配置上再加一些内容，从而让它变得真正有用。如下程序清单中的 WebConfig 解决了上面所述的问题。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc   // 启用 Spring MVC
@ComponentScan(&quot;syuez.web&quot;)     // 启用组件扫描
public class WebConfig implements WebMvcConfigurer {

    // 配置 JSP 视图解析器
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix(&quot;/WEB-INF/views/&quot;);
        resolver.setSuffix(&quot;.jsp&quot;);
        return resolver;
    }

    // 配置静态资源的处理
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面的程序清单中第一件需要注意的事情是 WebConfig 现在添加了 @ComponentScan 注解，因此将会扫描 syuez.web 包来查找组件。稍后你就会看到，我们所编写的控制器将会带有 @Controller 注解，这会使其成为组件扫描时的候选 bean。因此，我们不需要在配置类中显式声明任何的控制器。&lt;/p&gt;
&lt;p&gt;接下来，我们添加了一个 ViewResolver bean。更具体来讲，是 InternalResourceViewResolver。我们将会在后续更为详细地讨论视图解析器。我们只需要知道它会查找 JSP 文件，在查找的时候，它会在视图名称上加一个特定的前缀和后缀（例如，名为 home 的视图将会解析为 /WEB-INF/views/home.jsp）。&lt;/p&gt;
&lt;p&gt;最后，新的 WebConfig 类还扩展了 WebMvcConfigurer 并重写了其 &lt;code&gt;configureDefaultServletHandling()&lt;/code&gt; 方法。通过调用 DefaultServletHandlerConfigurer 的 &lt;code&gt;enable()&lt;/code&gt; 方法，我们要求 DispatcherServlet 将对静态资源的请求转发到 Servlet 容器中默认的 Servlet 上，而不是使用 DispatcherServlet 本身来处理此类请求。&lt;/p&gt;
&lt;p&gt;WebConfig 已经就绪，那 RootConfig 呢？因为本章聚焦于 Web 开发，而 Web 相关的配置通过 DispatcherServlet 创建的应用上下文都已经配置好了，因此现在的 RootConfig 相对很简单：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package syuez.config

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@ComponentScan(basePackages={&quot;syuez&quot;},
        excludeFilters={
                @Filter(type=FilterType.ANNOTATION, value= EnableWebMvc.class)
        })
public class RootConfig {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;唯一需要注意的是 RootConfig 使用了 @ComponentScan 注解。这样的话，在本书中，我们就有很多机会用非 Web 的组件来充实完善 RootConfig。&lt;/p&gt;
&lt;p&gt;现在，我们基本上已经可以开始使用 Spring MVC 构建 Web 应用了。此时，最大的问题在于，我们要构建的应用到底是什么。&lt;/p&gt;
&lt;h4&gt;Spittr 应用简介&lt;/h4&gt;
&lt;p&gt;为了实现在线社交的功能，我们将要构建一个简单的微博（microblogging）应用。在很多方面，我们所构建的应用与最早的微博应用 Twitter 很类似。在这个过程中，我们会添加一些小的变化。当然，我们要使用 Spring 技术来构建这个应用。&lt;/p&gt;
&lt;p&gt;因为从 Twitter 借鉴了灵感并且通过 Spring 来进行实现，所以它就有了一个名字：Spitter。再进一步，应用网站命名中流行的模式，如 Flickr，我们去掉字母 e，这样的话，我们就将这个应用称为 Spittr。这个名称也有助于区分应用名称和领域类型，因为我们将会创建一个名为 Spitter 的领域类。&lt;/p&gt;
&lt;p&gt;Spittr 应用有两个基本的领域概念：Spitter（应用的用户）和 Spittle（用户发布的简短状态更新）。当我们在书中完善 Spittr 应用的功能时，将会介绍这两个领域概念。在本章中，我们会构建应用的 Web 层，创建展现 Spittle 的控制器以及处理用户注册成为 Spitter 的表单。&lt;/p&gt;
&lt;p&gt;舞台已经搭建完成了。我们已经配置了 DispatcherServlet，启用了基本的 Spring MVC 组件并确定了目标应用。让我们进入本章的核心内容：使用 Spring MVC 控制器处理 Web 请求。&lt;/p&gt;
&lt;h4&gt;编写基本的控制器&lt;/h4&gt;
&lt;p&gt;在 Spring MVC 中，控制器只是方法上添加了 @RequestMapping 注解的类，这个注解声明了它们所要处理的请求。&lt;/p&gt;
&lt;p&gt;开始的时候，我们尽可能简单，假设控制器类要处理对 &lt;code&gt;/&lt;/code&gt; 的请求， 并渲染应用的首页。创建一个HomeController 控制器，它可能是最简单的 Spring MVC 控制器类了：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package syuez.web;

import static org.springframework.web.bind.annotation.RequestMethod.*;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller     // 声明为一个控制器
public class HomeController {

    @RequestMapping(value=&quot;/&quot;, method = GET)    // 处理对 &quot;/&quot; 的 GET 请求
    public String home(Model model) {
        return &quot;home&quot;;      // 视图名为 home
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你可能注意到的第一件事情就是 HomeController 带有 @Controller 注解。很显然这个注解是用来声明控制器的，但实际上这个注解对 Spring MVC 本身的影响并不大。&lt;/p&gt;
&lt;p&gt;HomeController 是一个构造型（stereotype）的注解，它基于 @Component 注解。在这里，它的目的就是辅助实现组件扫描。因为 HomeController 带有 @Controller 注解，因此组件扫描器会自动找到 HomeController，并将其声明为 Spring 应用上下文中的一个 bean。&lt;/p&gt;
&lt;p&gt;其实，你也可以让 HomeController 带有 @Component 注解，它所实现的效果是一样的，但是在表意性上可能会差一些，无法确定 HomeController 是什么组件类型。&lt;/p&gt;
&lt;p&gt;HomeController 唯一的一个方法，也就是 &lt;code&gt;home()&lt;/code&gt; 方法，带有 @Request-Mapping 注解。它的 value 属性指定了这个方法所要处理的请求路径，method 属性细化了它所处理的 HTTP 方法。在本例中，当收到对 &lt;code&gt;/&lt;/code&gt; 的 HTTP GET 请求时，就会调用 &lt;code&gt;home()&lt;/code&gt; 方法。&lt;/p&gt;
&lt;p&gt;你可以看到，&lt;code&gt;home()&lt;/code&gt; 方法其实并没有做太多的事情：它返回了一个 String 类型的 &lt;code&gt;home&lt;/code&gt; 。这个 String 将会被 Spring MVC 解读为要渲染的视图名称。DispatcherServlet 会要求视图解析器将这个逻辑名称解析为实际的视图。&lt;/p&gt;
&lt;p&gt;鉴于我们配置 InternalResourceViewResolver 的方式，视图名 &lt;code&gt;home&lt;/code&gt; 将会解析为 &lt;code&gt;/WEB-INF/views/home.jsp&lt;/code&gt; 路径的 JSP。现在，我们会让 Spittr 应用的首页相当简单，如下所示。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsonp&quot;&gt;&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@ page session=&quot;false&quot; %&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Spitter&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot;
          type=&quot;text/css&quot;
          href=&quot;&amp;lt;c:url value=&quot;/resources/style.css&quot; /&amp;gt;&quot; &amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Welcome to Spitter&amp;lt;/h1&amp;gt;

&amp;lt;a href=&quot;&amp;lt;c:url value=&quot;/spittles&quot; /&amp;gt;&quot;&amp;gt;Spittles&amp;lt;/a&amp;gt; |
&amp;lt;a href=&quot;&amp;lt;c:url value=&quot;/spitter/register&quot; /&amp;gt;&quot;&amp;gt;Register&amp;lt;/a&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 &lt;code&gt;value=&quot;/resources/style.css&quot;&lt;/code&gt; 就是最开始创建项目时的 &lt;code&gt;webapp/resources&lt;/code&gt;，这里放上基本的 CSS 样式：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;body {
    font-family: sans-serif;
}

.spittleList h1 {
    font-size: 16pt;
}

.spittleList ul {
    list-style: none;
    margin-left: 0px;
    padding-left: 0px;
} 

.spittleList ul li:first-child {
    border-top: 0px;
} 

.spittleList ul li {
    border-top: 1px solid #cccccc;
} 

.spittleTime {
    font-size: 8pt;
}

.spittleLocation {
    font-size: 8pt;
}

.spittleForm h1 {
    font-size: 16pt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至于&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsonp&quot;&gt;&amp;lt;a href=&quot;&amp;lt;c:url value=&quot;/spittles&quot; /&amp;gt;&quot;&amp;gt;Spittles&amp;lt;/a&amp;gt; |
&amp;lt;a href=&quot;&amp;lt;c:url value=&quot;/spitter/register&quot; /&amp;gt;&quot;&amp;gt;Register&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这两个 a 标签的连接所指向的控制器现在还没创建好，暂时不用管。&lt;/p&gt;
&lt;p&gt;简单介绍下 home 页面。它只是欢迎应用的用户，并提供了两个链接：一个是查看 Spittle 列表，另一个是在应用中进行注册。&lt;/p&gt;
&lt;p&gt;在本章完成之前，我们将会实现处理这些请求的控制器方法。但现在，让我们对这个控制器（ home 控制器）发起一些请求，看一下它是否能够正常工作。测试控制器最直接的办法可能就是构建并部署应用，然后通过浏览器对其进行访问，但是自动化测试可能会给你更快的反馈和更一致的独立结果。所以，让我们编写一个针对 HomeController 的测试。&lt;/p&gt;
&lt;h4&gt;测试控制器&lt;/h4&gt;
&lt;p&gt;让我们再审视一下 HomeController。如果你眼神不太好的话，你甚至可能注意不到这些注解，所看到的仅仅是一个简单的 POJO。我们都知道测试 POJO 是很容易的。因此，我们可以编写一个简单的类来测试 HomeController，如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static org.junit.Assert.assertEquals;
import org.junit.Test;
import syuez.web.HomeController;

public class HomeControllerTest {

    @Test
    public void testHomePage() throws Exception {
        HomeController controller = new HomeController();
        assertEuqals(&quot;home&quot;, controller.home());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个测试很简单，但它只测试了 &lt;code&gt;home()&lt;/code&gt; 方法中会发生什 么。在测试中会直接调用 &lt;code&gt;home()&lt;/code&gt; 方法，并断言返回包含 &lt;code&gt;home&lt;/code&gt; 值的 String。它完全没有站在 Spring MVC 控制器的视角进行测试。这个测试没有断言当接收到针对 &lt;code&gt;/&lt;/code&gt; 的 GET 请求时会调用 &lt;code&gt;home()&lt;/code&gt; 方法。因为它返回的值就是 &lt;code&gt;home&lt;/code&gt;，所以也没有真正判断 home 是视图的名称。&lt;/p&gt;
&lt;p&gt;不过从 Spring 3.2 开始，我们可以按照控制器的方式来测试 Spring MVC 中的控制器了，而不仅仅是作为 POJO 进行测试。Spring 现在包含了一种 mock Spring MVC 并针对控制器执行 HTTP 请求的机制。这样的话，在测试控制器的时候，就没有必要再启动 Web 服务器和 Web 浏览器 了。&lt;/p&gt;
&lt;p&gt;为了阐述如何测试 Spring MVC 的控制器，我们重写 HomeControllerTest 并使用 Spring MVC 中新的测试特性。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;

import org.junit.Test;
import org.springframework.test.web.servlet.MockMvc;

import syuez.web.HomeController;

public class HomeControllerTest {

    @Test
    public void testHomePage() throws Exception {
        HomeController controller = new HomeController();
        MockMvc mockMvc = standaloneSetup(controller).build();  // 搭建 MockMvc
        mockMvc.perform(get(&quot;/&quot;))   // 对 &quot;/&quot; 执行 GET 请求
                .andExpect(view().name(&quot;home&quot;));    // 预期得到 home 视图
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;尽管新版本的测试只比之前版本多了几行代码，但是它更加完整地测试了 HomeController。这次我们不是直接调用 &lt;code&gt;home()&lt;/code&gt; 方法并测试它的返回值，而是发起了对 &lt;code&gt;/&lt;/code&gt; 的 GET 请求，并断言结果视图的名称为 home。它首先传递一个 HomeController 实例到 &lt;code&gt;MockMvcBuilders.standaloneSetup()&lt;/code&gt; 并调用 &lt;code&gt;build()&lt;/code&gt; 来构建 MockMvc 实例。然后它使用 MockMvc 实例来执行针对 &lt;code&gt;/&lt;/code&gt; 的 GET 请求并设置期望得到的视图名称。&lt;/p&gt;
&lt;h4&gt;启动 Tomcat&lt;/h4&gt;
&lt;p&gt;尽管针对 HomeController 控制器的测试通过了，但是我们仍然没有在浏览器中真的测试过。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/43b4f381-2d1f-422a-a9cd-7093cd5a3119.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击编辑配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/83947b20-ef1b-47f6-8478-1d65d84d25d5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击添加，找到Tomcat&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/f2a20958-b18f-4c19-9288-f8436b9656fe.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;根据实际环境按照上图配置，然后添加部署标签&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/cbb41758-1414-4e81-892f-a4cb605fdb07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后点击确定。运行 Tomcat 即可，在浏览器中输入 &lt;code&gt;http://localhost:8080/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/ed316880-9104-4a3e-b1ac-762b9b8af35a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;文本来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://potoyang.gitbook.io/spring-in-action-v4/di-5-zhang-gou-jian-spring-web-ying-yong-cheng-xu/untitled-1&quot;&gt;5.1　Spring MVC 起步 - Spring 实战(第四版) (gitbook.io)&lt;/a&gt; 有删改。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/SpringMVC%E8%B5%B7%E6%AD%A5.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/SpringMVC%E8%B5%B7%E6%AD%A5.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring面向切面中处理通知中的参数</title>
            <description>
            &lt;!--
author: admin
date: 2022-05-06
title: Spring面向切面中处理通知中的参数
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring面向切面中处理通知中的参数&lt;/h1&gt;
&lt;p&gt;到目前为止，我们的切面都很简单，没有任何参数。唯一的例外是我们为环绕通知所编写的 &lt;code&gt;watchPerformance()&lt;/code&gt; 示例方法中使用了 ProceedingJoinPoint 作为参数。除了环绕通知，我们编写的其他通知不需要关注传递给被通知方法的任意参数。这很正常，因为我们所通知的 &lt;code&gt;perform()&lt;/code&gt; 方法本身没有任何参数。&lt;/p&gt;
&lt;p&gt;但是，如果切面所通知的方法确实有参数该怎么办呢？切面能访问和使用传递给被通知方法的参数吗？&lt;/p&gt;
&lt;p&gt;为了阐述这个问题，让我们重新看一下 &lt;code&gt;BlankDisc&lt;/code&gt; 样例。&lt;code&gt;play()&lt;/code&gt; 方法会循环所有磁道上的歌曲。如果我需要单独播放某个磁道上的歌曲呢？为此，我们需要修改一下 &lt;code&gt;CompactDisc&lt;/code&gt; 接口，添加一个 &lt;code&gt;playTrack()&lt;/code&gt; 方法，我们可以通过 &lt;code&gt;playTrack()&lt;/code&gt; 方法直接播放某一个磁道中的歌曲。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 一个CD唱片接口
 */
public interface CompactDisc {
    /**
     * 播放
     */
    void play();
    /**
     * 播放指定音轨
     * @param trackNum 音轨
     */
    void playTrack(int trackNum);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;BlankDisc&lt;/code&gt; 中重写 &lt;code&gt;playTrack()&lt;/code&gt; 方法&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import java.util.List;

public class BlankDisc implements CompactDisc {
    private String title;
    private String artist;
    private List&amp;lt;String&amp;gt; tracks; // 磁道，CD 都会包含十多个磁道，每个磁道上包含一首歌

    public BlankDisc(String title, String artist, List&amp;lt;String&amp;gt; tracks) {
        this.title = title;
        this.artist = artist;
        this.tracks = tracks;
    }

    @Override
    public void playTrack(int trackNum) {
        System.out.println(&quot;Playing &quot; + title + &quot;【&quot;+tracks.get(trackNum-1)+&quot;】 by &quot; + artist);
    }

    @Override
    public void play() {
        System.out.println(&quot;Playing &quot; + title + &quot; by &quot; + artist);
        for (String track : tracks) {
            System.out.println(&quot;-Track: &quot; + track);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;假设你现在想记录每个磁道被播放的次数。一种方法就是修改 &lt;code&gt;playTrack()&lt;/code&gt; 方法，直接在每次调用的时候记录这个数量。但是，记录磁道的播放次数与播放本身是不同的关注点，因此不应该属于 &lt;code&gt;playTrack()&lt;/code&gt; 方法。看起来，这应该是切面要完成的任务。&lt;/p&gt;
&lt;p&gt;为了记录每个磁道所播放的次数，我们创建了 TrackCounter 类，它是通知 &lt;code&gt;playTrack()&lt;/code&gt; 方法的一个切面。TrackCounter 类使用参数化的通知来记录磁道播放的次数：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

import java.util.HashMap;
import java.util.Map;

@Aspect
public class TrackCounter {
    private Map&amp;lt;Integer, Integer&amp;gt; trackCounts = new HashMap&amp;lt;&amp;gt;();

    @Pointcut(&quot;execution(* com.syuez.CompactDisc.playTrack(int)) &amp;amp;&amp;amp; args(trackNumber)&quot;)  // 通知 playTrack() 方法
    public void trackPlayed(int trackNumber) { }

    @Before(&quot;trackPlayed(trackNumber)&quot;)  // 在播放前为该磁道计数
    public void countTrack(int trackNumber) {
        int currentCount = getPlayCount(trackNumber);
        trackCounts.put(trackNumber, currentCount + 1);
    }

    public int getPlayCount(int trackNumber) {
        return trackCounts.containsKey(trackNumber) ? trackCounts.get(trackNumber) : 0;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;像之前所创建的切面一样，这个切面使用 @Pointcut 注解定义命名的切点，并使用 @Before 将一个方法声明为前置通知。但是，这里的不同点在于切点还声明了要提供给通知方法的参数。图 4.6 将切点表达式进行了分解，以展现参数是在什么地方指定的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/f2a0ec6f-9da8-43ae-a2d6-9234b696a6b7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在图 4.6 中需要关注的是切点表达式中的 &lt;code&gt;args(trackNumber)&lt;/code&gt; 限定符。它表明传递给 &lt;code&gt;playTrack()&lt;/code&gt; 方法的 int 类型参数也会传递到通知中去。参数的名称 trackNumber 也与切点方法签名中的参数相匹配。&lt;/p&gt;
&lt;p&gt;这个参数会传递到通知方法中，这个通知方法是通过 @Before 注解和命名切点 &lt;code&gt;trackPlayed(trackNumber)&lt;/code&gt; 定义的。切点定义中的参数与切点方法中的参数名称是一样的，这样就完成了从命名切点到通知方法的参数转移。&lt;/p&gt;
&lt;p&gt;现在，我们可以在 Spring 配置中将 BlankDisc 和 TrackCounter 定义为 bean，并启用 AspectJ 自动代理：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.ImportResource;
import org.springframework.test.context.ContextConfiguration;

@ContextConfiguration
@EnableAspectJAutoProxy
@ImportResource({&quot;classpath*:blank-disc.xml&quot;})
public class TrackCounterConfig {
    @Bean
    public TrackCounter trackCounter() {
        return new TrackCounter();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，为了证明它能正常工作，你可以编写如下的简单测试。它会播放几个磁道并通过 TrackCounter 断言播放的数量。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.junit.Assert.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TrackCounterConfig.class)
public class TrackCounterTest {
    @Autowired
    private CompactDisc cd;

    @Autowired
    private TrackCounter counter;

    @Test
    public void testTrackCounter() {
        cd.playTrack(1);
        cd.playTrack(2);
        cd.playTrack(3);
        cd.playTrack(3);
        cd.playTrack(3);
        cd.playTrack(3);
        cd.playTrack(5);
        cd.playTrack(5);

        assertEquals(1, counter.getPlayCount(1));
        assertEquals(1, counter.getPlayCount(2));
        assertEquals(4, counter.getPlayCount(3));
        assertEquals(0, counter.getPlayCount(4));
        assertEquals(2, counter.getPlayCount(5));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;到目前为止，在我们所使用的切面中，所包装的都是被通知对象的已有方法。但是，方法包装仅仅是切面所能实现的功能之一。之后将学习如何通过编写切面，为被通知的对象引入全新的功能。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Spring%E9%9D%A2%E5%90%91%E5%88%87%E9%9D%A2%E4%B8%AD%E5%A4%84%E7%90%86%E9%80%9A%E7%9F%A5%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Spring%E9%9D%A2%E5%90%91%E5%88%87%E9%9D%A2%E4%B8%AD%E5%A4%84%E7%90%86%E9%80%9A%E7%9F%A5%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring配置的混合使用</title>
            <description>
            &lt;!--
author: admin
date: 2022-05-03
title: Spring配置的混合使用
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring配置的混合使用&lt;/h1&gt;
&lt;p&gt;在之前的文章中（&lt;a href=&quot;https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84Bean%E8%A3%85%E9%85%8D.html&quot;&gt;Spring中的Bean装配|学习笔记 (syuez.com)&lt;/a&gt;）讲了 Spring 的自动装配，但是有时候不得不使用 XML 配置。本文将简单介绍一下 Java 配置和 XML 配置混合使用的情景。&lt;/p&gt;
&lt;p&gt;在之前定义的 SgtPeppers 唱片中只包含了唱片名称和艺术家的名字。如果现实世界中的 CD 也是这样的话，那么在技术上就不会任何的进展。CD 之所以值得购买是因为它上面所承载的音乐。大多数的 CD 都会包含十多个磁道，每个磁道上包含一首歌。&lt;/p&gt;
&lt;p&gt;如果使用 CompactDisc 为真正的 CD 建模，那么它也应该有磁道列表的概念。请考虑下面这个新的 BlankDisc：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import java.util.List;

public class BlankDisc implements CompactDisc {

    private String title;
    private String artist;
    private List&amp;lt;String&amp;gt; tracks; // 磁道，CD 都会包含十多个磁道，每个磁道上包含一首歌

    public BlankDisc(String title, String artist, List&amp;lt;String&amp;gt; tracks) {
        this.title = title;
        this.artist = artist;
        this.tracks = tracks;
    }

    @Override
    public void play() {
        System.out.println(&quot;Playing &quot; + title + &quot; by &quot; + artist);
        for (String track : tracks) {
            System.out.println(&quot;-Track: &quot; + track);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个变更会对 Spring 如何配置 bean 产生影响，在声明 bean 的时候，我们必须要提供一个磁道列表。最简单的办法是将列表设置为 null，将 null 传递给构造器。因为它是一个构造器参数，所以必须要声明它。&lt;/p&gt;
&lt;p&gt;这并不是解决问题的好办法，虽然在注入期它能正常执行。但当调用 play() 方法时，你会遇到 NullPointerException 异常，因此并不是理想的方案。&lt;/p&gt;
&lt;p&gt;更好的解决方法是提供一个磁道名称的列表。在 resources 目录中创建 Spring XML 配置文件 blank-disc.xml ：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
       xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;
    &amp;lt;bean id=&quot;blankDisc&quot; class=&quot;com.syuez.BlankDisc&quot; primary=&quot;true&quot;&amp;gt;

        &amp;lt;constructor-arg index=&quot;0&quot; value=&quot;Sgt. Pepper&#039;s Lonely Hearts Club Band&quot; /&amp;gt;
        &amp;lt;constructor-arg index=&quot;1&quot; value=&quot;The Beatles&quot; /&amp;gt;
        &amp;lt;constructor-arg index=&quot;2&quot;&amp;gt;
            &amp;lt;list&amp;gt;
                &amp;lt;value&amp;gt;Sgt. Pepper&#039;s Lonely Hearts Club Band&amp;lt;/value&amp;gt;
                &amp;lt;value&amp;gt;With a Little Help from My Friends&amp;lt;/value&amp;gt;
                &amp;lt;value&amp;gt;Lucy in the Sky with Diamonds&amp;lt;/value&amp;gt;
                &amp;lt;value&amp;gt;Getting Better&amp;lt;/value&amp;gt;
                &amp;lt;value&amp;gt;Fixing a Hole&amp;lt;/value&amp;gt;
            &amp;lt;/list&amp;gt;
        &amp;lt;/constructor-arg&amp;gt;
    &amp;lt;/bean&amp;gt;

&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于此处存在多个符合 CDPlayer 自动注入的 CompactDisc 类，所以添加了 &lt;code&gt;primary&lt;/code&gt; 标签来标示首选的 bean。&lt;/p&gt;
&lt;p&gt;接着要使 blank-disc.xml 生效，在 CDPlayerConfig 中添加 &lt;code&gt;@ImportResource&lt;/code&gt; 注解：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
/**
 * CD配置类
 */
@Configuration
@ComponentScan
@ImportResource({&quot;classpath*:blank-disc.xml&quot;})
public class CDPlayerConfig {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重新运行 CDPlayerTest 测试，看是否通过&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/f163b813-5b3d-4cd3-9c20-c1ef1ed133d7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.superweb999.com/article/783753.html&quot;&gt;Spring 自动装配，Java 配置，XML配置、混合使用 - 程序员文章站 (superweb999.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.javaguides.net/2018/09/spring-importresource-annotation-example.html&quot;&gt;Spring @ImportResource Annotation Example (javaguides.net)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/Vermont_/article/details/109118810&quot;&gt;详解Spring项目中的classpath路径_Allen Chou的博客-CSDN博客_spring获取classpath路径&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/62357409/what-is-the-alternative-of-using-qualifier-annotation-in-xml-in-spring&quot;&gt;What is the alternative of using @Qualifier annotation in XML in Spring? - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/8345723/java-spring-tagging-beans-in-xml-to-get-specific-bean-by-class-and-tag&quot;&gt;Java / Spring: &amp;quot;Tagging&amp;quot; beans in XML to get specific bean by class and tag - Stack Overflow&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Spring%E9%85%8D%E7%BD%AE%E7%9A%84%E6%B7%B7%E5%90%88%E4%BD%BF%E7%94%A8.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Spring%E9%85%8D%E7%BD%AE%E7%9A%84%E6%B7%B7%E5%90%88%E4%BD%BF%E7%94%A8.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>面向切面的Spring</title>
            <description>
            &lt;!--
author: admin
date: 2022-04-29
title: 面向切面的Spring
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;面向切面的Spring&lt;/h1&gt;
&lt;p&gt;之前已有一篇《Spring中的面向切面》简单的介绍了一下，这次按照《Spring实战》的第四章来详细讲述一下面向切面。&lt;/p&gt;
&lt;p&gt;在软件系统中有一些功能需要用到应用程序的多个地方，但是我们又不想在每个点都明确调用它们。日志、安全和事物管理的确都很重要，但它们是否是应用对象主动参与的行为呢？如果让应用对象只关注于自己所针对的业务领域问题，而其他方面的问题由其他应用对象来处理，这会不会更好呢？&lt;/p&gt;
&lt;p&gt;在软件开发中，散布于应用中多处的功能被称为横切关注点（crosscutting concern）。通常来讲，这些横切关注点从概念上是与应用的业务逻辑相分离的（但是往往会直接嵌入到应用的业务逻辑之中）。把这些横切关注点与业务逻辑相分离正是面向切面编程（AOP）所要解决的问题。&lt;/p&gt;
&lt;p&gt;之前，我们介绍了如何使用依赖注入（DI）管理和配置我们的应用对象。DI 有助于应用对象之间的解耦，而 AOP 可以实现横切关注点与它们所影响的对象之间的解耦。&lt;/p&gt;
&lt;p&gt;日志是应用切面的常见范例，但它并不是切面适用的唯一场景。通览本书，我们还会看到切面所适用的多个场景，包括声明式事务、安全和缓存。&lt;/p&gt;
&lt;h4&gt;什么是面向切面编程&lt;/h4&gt;
&lt;p&gt;如前所述，切面能帮助我们模块化横切关注点。简而言之，横切关注点可以被描述为影响应用多处的功能。例如，安全就是一个横切关注点，应用中的许多方法都会涉及到安全规则。图 4.1 直观呈现了横切关注点的概念。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/d5900604-9cd1-4d39-b5ec-8f26608c1ba0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图 4.1展现了一个被划分为模块的典型应用。每个模块的核心功能都是为特定业务领域提供服务，但是这些模块都需要类似的辅助功能，例如安全和事务管理。&lt;/p&gt;
&lt;p&gt;如果要重用通用功能的话，最常见的面向对象技术是继承（inheritance）或委托（delegation）。但是，如果在整个应用中都使用相同的基类，继承往往会导致一个脆弱的对象体系；而使用委托可能需要对委托对象进行复杂的调用。&lt;/p&gt;
&lt;p&gt;切面提供了取代继承和委托的另一种可选方案，而且在很多场景下更清晰简洁。在使用面向切面编程时，我们仍然在一个地方定义通用功能，但是&lt;strong&gt;可以通过声明的方式定义这个功能要以何种方式在何处应用，而无需修改受影响的类&lt;/strong&gt;。横切关注点可以被模块化为特殊的类，这些类被称为切面（aspect）。这样做有两个好处：首先，现在每个关注点都集中于一个地方，而不是分散到多处代码中；其次，服务模块更简洁，因为它们只包含主要关注点（或核心功能）的代码，而次要关注点的代码被转移到切面中了。&lt;/p&gt;
&lt;h4&gt;定义AOP术语&lt;/h4&gt;
&lt;p&gt;与大多数技术一样，AOP 已经形成了自己的术语。描述切面的常用术语有通知（advice）、切点（pointcut）和连接点（join point）。图 4.2 展示了这些概念是如何关联在一起的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/29dd03eb-97a6-43ab-9b16-125b4f61fc42.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;遗憾的是，大多数用于描述 AOP 功能的术语并不直观，尽管如此，它们现在已经是 AOP 行话的组成部分了，为了理解 AOP，我们必须了解这些术语。在我们进入某个领域之前，必须学会在这个领域该如何说话。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aspect(切面)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Aspect&lt;/code&gt;由&lt;code&gt;Pointcut&lt;/code&gt;和&lt;code&gt;Advice&lt;/code&gt;组成，它既包含了横切逻辑的定义，也包括了连接点的定义。Spring AOP就是负责实施切面的框架，它将切面所定义的横切逻辑织入到切面所指定的连接点中。&lt;/p&gt;
&lt;p&gt;AOP的工作重心在于如何将&lt;code&gt;Advice&lt;/code&gt;织入目标对象的连接点上，这里包含两个工作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如何通过 pointcut 和 advice 定位到特定的 join point 上&lt;/li&gt;
&lt;li&gt;如何在 advice 中编写切面代码&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可以简单地认为，使用 @Aspect 注解的类就是切面。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Advice(通知)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由 aspect 添加到特定的 join point (即满足 pointcut 规则的 join point ) 的一段代码。许多 AOP 框架，包括 Spring AOP，会将 advice 模拟为一个拦截器(interceptor)，并且在 join point 上维护多个 advice，进行层层拦截。&lt;/p&gt;
&lt;p&gt;例如 HTTP 鉴权的实现，我们可以为每个使用 RequestMapping 标注的方法织入 advice，当 HTTP 请求到来时，首先进入到 advice 代码中，在这里我们可以分析这个 HTTP 请求是否有相应的权限，如果有，则执行 Controller，如果没有，则抛出异常。这里的 advice 就扮演着鉴权拦截器的角色了。&lt;/p&gt;
&lt;p&gt;Spring 切面可以应用 5 种类型的通知：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前置通知（Before）：在目标方法被调用之前调用通知功能；&lt;/li&gt;
&lt;li&gt;后置通知（After）：在目标方法完成之后调用通知，此时不会关心方法的输出是什么；&lt;/li&gt;
&lt;li&gt;返回通知（After-returning）：在目标方法成功执行之后调用通知；&lt;/li&gt;
&lt;li&gt;异常通知（After-throwing）：在目标方法抛出异常后调用通知；&lt;/li&gt;
&lt;li&gt;环绕通知（Around）：通知包裹了被通知的方法，在被通知的方法调用之前和调用之后执行自定义的行为。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Join point&lt;/code&gt;(连接点)&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;a point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;程序运行中的一些时间点，例如一个方法的执行，或者是一个异常的处理。在 Spring AOP 中，join point 总是方法的执行点，即只有方法连接点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Pointcut&lt;/code&gt;(切点)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;匹配 join point 的谓词(a predicate that matches join points)。advice 是和特定的 pointcut 关联的，并且在 pointcut 相匹配的 join point 中执行。&lt;/p&gt;
&lt;p&gt;在 Spring 中，所有的方法都可以认为是 joinpoint，但是我们并不希望在所有的方法上都添加 advice，而 pointcut 的作用就是提供一组规则(使用 AspectJ pointcut expression language 来描述)来匹配 join point，给满足规则的 join point 添加 advice。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;关于join point 和 pointcut 的区别&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;在 Spring AOP 中，所有的方法执行都是 join point。而 pointcut 是一个描述信息，它修饰的是 join point，通过 pointcut，我们就可以确定哪些 join point 可以被织入 advice。因此 join point 和 pointcut 本质上就是两个不同纬度上的东西。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Introduction&lt;/code&gt;(引入)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为一个类型添加额外的方法或字段。Spring AOP 允许我们为 &lt;code&gt;目标对象&lt;/code&gt; 引入新的接口(和对应的实现).。例如我们可以使用 introduction 来为一个 bean 实现 IsModified 接口，并以此来简化 caching 的实现。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Target&lt;/code&gt;(目标对象)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;织入 advice 的目标对象. 目标对象也被称为 &lt;code&gt;advised object&lt;/code&gt;。
因为 Spring AOP 使用运行时代理的方式来实现 aspect，因此 adviced object 总是一个代理对象(proxied object)。注意，adviced object 指的不是原来的类，而是织入 advice 后所产生的代理类。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;AOP Proxy&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个类被 AOP 织入 advice，就会产生一个结果类，它是融合了原类和增强逻辑的代理类。在 Spring AOP 中，一个 AOP 代理是一个 JDK 动态代理对象或 CGLIB 代理对象。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Weaving&lt;/code&gt;(织入)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;将 aspect 和其他对象连接起来，并创建 adviced object 的过程。根据不同的实现技术，AOP织入有三种方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;编译器织入，这要求有特殊的 Java 编译器&lt;/li&gt;
&lt;li&gt;类装载期织入，这需要有特殊的类装载器&lt;/li&gt;
&lt;li&gt;动态代理织入，在运行期为目标类添加 Advice 生成子类的方式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Spring 采用动态代理织入，而 Aspectj 则采用编译器织入和类装载期织入。&lt;/p&gt;
&lt;p&gt;关于 AOP Proxy&lt;/p&gt;
&lt;p&gt;Spring AOP 默认使用标准的 JDK 动态代理(dynamic proxy)技术来实现 AOP 代理，通过它，我们可以为任意的接口实现代理。&lt;/p&gt;
&lt;p&gt;如果需要为一个类实现代理，那么可以使用 CGLIB 代理。当一个业务逻辑对象没有实现接口时，那么Spring AOP 就默认使用 CGLIB 来作为 AOP 代理了。即如果我们需要为一个方法织入 advice，但是这个方法不是一个接口所提供的方法，则此时 Spring AOP 会使用 CGLIB 来实现动态代理。鉴于此，Spring AOP 建议基于接口编程，对接口进行 AOP 而不是类。&lt;/p&gt;
&lt;p&gt;要掌握的新术语可真不少啊。再看一下图 4.1，现在我们已经了解了如下的知识，&lt;strong&gt;通知&lt;/strong&gt;包含了需要用于多个应用对象的横切行为；&lt;strong&gt;连接点&lt;/strong&gt;是程序执行过程中能够应用通知的所有点；&lt;strong&gt;切点&lt;/strong&gt;定义了通知被应用的具体位置（在哪些连接点）。其中关键的概念是&lt;strong&gt;切点定义了哪些连接点会得到通知&lt;/strong&gt;。&lt;/p&gt;
&lt;h4&gt;Spring 对 AOP 的支持&lt;/h4&gt;
&lt;p&gt;并不是所有的 AOP 框架都是相同的，它们在连接点模型上可能有强弱之分。有些允许在字段修饰符级别应用通知，而另一些只支持与方法调用相关的连接点。它们织入切面的方式和时机也有所不同。但是无论如何，创建切点来定义切面所织入的连接点是 AOP 框架的基本功能。&lt;/p&gt;
&lt;p&gt;Spring 提供了 4 种类型的 AOP 支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于代理的经典 Spring AOP；&lt;/li&gt;
&lt;li&gt;纯 POJO 切面；&lt;/li&gt;
&lt;li&gt;@AspectJ 注解驱动的切面；&lt;/li&gt;
&lt;li&gt;注入式 AspectJ 切面（适用于 Spring 各版本）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前三种都是 Spring AOP 实现的变体，Spring AOP 构建在动态代理基础之上，因此，Spring 对 AOP 的支持局限于方法拦截。&lt;/p&gt;
&lt;p&gt;借助 Spring 的 aop 命名空间，我们可以将纯 POJO 转换为切面。实际上，这些 POJO 只是提供了满足切点条件时所要调用的方法。遗憾的是，这种技术需要 XML 配置，但这的确是声明式地将对象转换为切面的简便方式。&lt;/p&gt;
&lt;p&gt;Spring 借鉴了 AspectJ 的切面，以提供注解驱动的 AOP。本质上，它依然是 Spring 基于代理的 AOP，但是编程模型几乎与编写成熟的 AspectJ 注解切面完全一致。这种 AOP 风格的好处在于能够不使用 XML 来完成功能。 如果你的 AOP 需求超过了简单的方法调用（如构造器或属性拦截），那么你需要考虑使用 AspectJ 来实现切面。在这种情况下，上文所示的第四种类型能够帮助你将值注入到 AspectJ 驱动的切面中。&lt;/p&gt;
&lt;p&gt;在开始之前，我们必须要了解 Spring AOP 框架的一些关键知识。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spring 通知是 Java 编写的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spring 所创建的通知都是用标准的 Java 类编写的。这样的话，我们就可以使用与普通 Java 开发一样的集成开发环境（IDE）来开发切面。而且，定义通知所应用的切点通常会使用注解或在 Spring 配置文件里采用 XML 来编写，这两种语法对于 Java 开发者来说都是相当熟悉的。&lt;/p&gt;
&lt;p&gt;AspectJ 与之相反。虽然 AspectJ 现在支持基于注解的切面，但 AspectJ 最初是以 Java 语言扩展的方式实现的。这种方式有优点也有缺点。通过特有的 AOP 语言，我们可以获得更强大和细粒度的控制，以及更丰富的 AOP 工具集，但是我们需要额外学习新的工具和语法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spring在运行时通知对象&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过在代理类中包裹切面，Spring 在运行期把切面织入到 Spring 管理的 bean 中。如图 4.3 所示，代理类封装了目标类，并拦截被通知方法的调用，再把调用转发给真正的目标 bean。当代理拦截到方法调用时， 在调用目标 bean 方法之前，会执行切面逻辑。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/bd1776bb-5870-400e-9889-83dcc0bbd22a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;直到应用需要被代理的 bean 时，Spring 才创建代理对象。如果使用的是 ApplicationContext 的话，在 ApplicationContext 从 BeanFactory 中加载所有 bean 的时候，Spring 才会创建被代理的对象。因为 Spring 运行时才创建代理对象，所以我们不需要特殊的编译器来织入 Spring AOP 的切面。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spring 只支持方法级别的连接点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正如前面所探讨过的，通过使用各种 AOP 方案可以支持多种连接点模型。因为 Spring 基于动态代理，所以 Spring 只支持方法连接点。这与一些其他的 AOP 框架是不同的，例如 AspectJ 和 JBoss，除了方法切点，它们还提供了字段和构造器接入点。Spring 缺少对字段连接点的支持，无法让我们创建细粒度的通知，例如拦截对象字段的修改。而且它不支持构造器连接点，我们就无法在 bean 创建时应用通知。&lt;/p&gt;
&lt;p&gt;但是方法拦截可以满足绝大部分的需求。如果需要方法拦截之外的连接点拦截功能，那么我们可以利用 AspectJ 来补充 Spring AOP 的功能。&lt;/p&gt;
&lt;p&gt;对于什么是 AOP 以及 Spring 如何支持 AOP 的，我们现在已经有了一个大致的了解。现在是时候学习如何在 Spring 中创建切面了，让我们先从 Spring 的声明式 AOP 模型开始。&lt;/p&gt;
&lt;h4&gt;通过切点来选择连接点&lt;/h4&gt;
&lt;p&gt;正如之前所提过的，切点用于准确定位应该在什么地方应用切面的通知。通知和切点是切面的最基本元素。因此，了解如何编写切点非常重要。&lt;/p&gt;
&lt;p&gt;在 Spring AOP 中，要使用 AspectJ 的切点表达式语言来定义切点。关于 Spring AOP 的 AspectJ 切点，最重要的一点就是 Spring 仅支持 AspectJ 切点指示器（pointcut designator）的一个子集。让我们回顾下，Spring 是基于代理的，而某些切点表达式是与基于代理的 AOP 无关的。表 4.1 列出了 Spring AOP 所支持的 AspectJ 切点指示器。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AspectJ 指示器&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;arg()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;限制连接点匹配参数为指定类型的执行方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@args()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;限制连接点匹配参数由指定注解标注的执行方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;execution()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用于匹配是连接点的执行方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;this()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;限制连接点匹配 AOP 代理的 bean 引用为指定类型的类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;target&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;限制连接点匹配目标对象为指定类型的类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@target()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;限制连接点匹配特定的执行对象，这些对象对应的类要具有指定类型的注解&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;within()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;限制连接点匹配指定的类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@within()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;限制连接点匹配指定注解所标注的类型（当使用 Spring AOP 时，方 法定义在由指定的注解所标注的类里）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@annotation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;限定匹配带有指定注解的连接点&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;在 Spring 中尝试使用 AspectJ 其他指示器时，将会抛出 &lt;code&gt;IllegalArgumentException&lt;/code&gt;异常。&lt;/p&gt;
&lt;p&gt;当我们查看如上所展示的这些 Spring 支持的指示器时，注意只有 execution 指示器是实际执行匹配的，而其他的指示器都是用来限制匹配的。这说明 execution 指示器是我们在编写切点定义时最主要使用的指示器。在此基础上，我们使用其他指示器来限制所匹配的切点。&lt;/p&gt;
&lt;h4&gt;编写切点&lt;/h4&gt;
&lt;p&gt;为了阐述 Spring 中的切面，我们需要有个主题来定义切面的切点。为此，我们定义一个 Performance 接口：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 这个是一个演出接口
 * 可以代表任何类型的现场表演
 * 如舞台剧、演唱会等等。
 */
public interface Performance {
    /**
     * 表演
     */
    public void perform();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Performance 可以代表任何类型的现场表演，如舞台剧、电影或音乐会。假设我们想编写 Performance 的 &lt;code&gt;perform()&lt;/code&gt; 方法触发的通知。图 4.4 展现了一个切点表达式，这个表达式能够设置当 &lt;code&gt;perform()&lt;/code&gt; 方法执行时触发通知的调用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/7a8ecd90-a1f7-4673-885a-14cc943c5c8f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们使用 &lt;code&gt;execution()&lt;/code&gt; 指示器选择 Performance 的 &lt;code&gt;perform()&lt;/code&gt; 方法。方法表达式以 &amp;quot;*&amp;quot; 号开始，表明了我们不关心方法返回值的类型。然后，我们指定了全限定类名和方法名。对于方法参数列表，我们使用两个点号&lt;code&gt;（..）&lt;/code&gt;表明切点要选择任意的 &lt;code&gt;perform()&lt;/code&gt; 方法，无论该方法的入参是什么。&lt;/p&gt;
&lt;p&gt;现在假设我们需要配置的切点仅匹配 concert 包。在此场景下，可以使用 within() 指示器来限制匹配，如图4.5 所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/83742844-b09b-41b0-ace0-9d8ff1b45809.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;请注意我们使用了 “&amp;amp;&amp;amp;” 操作符把 &lt;code&gt;execution()&lt;/code&gt; 和 &lt;code&gt;within()&lt;/code&gt; 指示器连接在一起形成与（and）关系（切点必须匹配所有的指示器）。类似地，我们可以使用 “||” 操作符来标识或（or）关系，而使用 “!” 操作符来标识非（not）操作。&lt;/p&gt;
&lt;p&gt;因为 &amp;quot;&amp;amp;&amp;quot; 在 XML 中有特殊含义，所以在 Spring 的 XML 配置里面描述切点时，我们可以使用 and 来代替 &amp;quot;&amp;amp;&amp;amp;&amp;quot;。同样，or 和 not 可以分别用来代替 &amp;quot;||&amp;quot; 和 &amp;quot;!&amp;quot;。&lt;/p&gt;
&lt;h4&gt;在切点中选择 bean&lt;/h4&gt;
&lt;p&gt;除了表 4.1 所列的指示器外，Spring 还引入了一个新的 bean() 指示器，它允许我们在切点表达式中使用 bean 的 ID 来标识 bean。bean() 使用 bean ID 或 bean 名称作为参数来限制切点只匹配特定的 bean。&lt;/p&gt;
&lt;p&gt;例如，考虑如下的切点：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;execution(* concert.Performance.perform()) and bean(&#039;woodstock&#039;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这里，我们希望在执行 Performance 的 perform() 方法时应用通知，但限定 bean 的 ID 为 woodstock。&lt;/p&gt;
&lt;p&gt;在某些场景下，限定切点为指定的 bean 或许很有意义，但我们还可以使用非操作为除了特定 ID 以外的其他 bean 应用通知：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;execution(* concert.Performance.perform()) and !bean(&#039;woodstock&#039;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在此场景下，切面的通知会被编织到所有 ID 不为 woodstock 的 bean 中。&lt;/p&gt;
&lt;p&gt;现在，我们已经讲解了编写切点的基础知识，让我们再了解一下如何编写通知和使用这些切点声明切面。&lt;/p&gt;
&lt;h4&gt;使用注解创建切面&lt;/h4&gt;
&lt;p&gt;使用注解来创建切面是 AspectJ 5 所引入的关键特性。AspectJ 5 之前，编写 AspectJ 切面需要学习一种 Java 语言的扩展，但是 AspectJ 面向注解的模型可以非常简便地通过少量注解把任意类转变为切面。&lt;/p&gt;
&lt;p&gt;我们已经定义了 Performance 接口，它是切面中切点的目标对象。现在，让我们使用 AspecJ 注解来定义切面。但在这个之前先开一场演唱会吧！&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import java.util.Random;
/**
 * 一个演唱会类
 */
public class SingPerformance implements Performance {
    @Override
    public void perform() {
        System.out.println(&quot;表演中...&quot;);
        // 测试Enforceable时先注释，避免抛出异常影响测试
        Random random = new Random(System.nanoTime());
        if(random.nextInt(10) % 2 == 0) {   //[0,10)能被2整除就演砸
            throw new RuntimeException(&quot;演砸了&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;SingPerformance&lt;/code&gt;实现了&lt;code&gt;Performance&lt;/code&gt;接口，重写了&lt;code&gt;perform&lt;/code&gt;方法，并且还增加了演出可能不太行的可能性 q(≧▽≦q)&lt;/p&gt;
&lt;h4&gt;定义切面&lt;/h4&gt;
&lt;p&gt;如果一场演出没有观众的话，那不能称之为演出。对不对？从演出的角度来看，观众是非常重要的，但是对演出本身的功能来讲，它并不是核心，这是一个单独的关注点。因此，将观众定义为一个切面，并将其应用到演出上就是较为明智的做法。&lt;/p&gt;
&lt;p&gt;创建一个&lt;code&gt;Audience&lt;/code&gt; 观众类，它定义了我们所需的一个切面。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
/**
 * 这是一个观众类
 */
@Aspect
public class Audience {

    @Before(&quot;execution(* com.syuez.Performance.perform(..))&quot;)
    public void silenceCellPhones() {
        System.out.println(&quot;设置手机为静音模式&quot;);
    }

    @Before(&quot;execution(* com.syuez.Performance.perform(..))&quot;)
    public void takeSeats() {
        System.out.println(&quot;入座&quot;);
    }

    @AfterReturning(&quot;execution(* com.syuez.Performance.perform(..))&quot;)
    public void applause() {
        System.out.println(&quot;鼓掌!!!&quot;);
    }

    @AfterThrowing(&quot;execution(* com.syuez.Performance.perform(..))&quot;)
    public void demandRefund() {
        System.out.println(&quot;RNM，退钱!!!&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Audience 类使用 &lt;code&gt;@AspectJ&lt;/code&gt; 注解进行了标注。该注解表明 Audience 不仅仅是一个 POJO，还是一个切面。Audience 类中的方法都使用注解来定义切面的具体行为。&lt;/p&gt;
&lt;p&gt;Audience 有四个方法，定义了一个观众在观看演出时可能会做的事情。在演出之前，观众要就坐 &lt;code&gt;takeSeats()&lt;/code&gt; 并将手机调至静音状态 &lt;code&gt;silenceCellPhones()&lt;/code&gt;。如果演出很精彩的话，观众应该会鼓掌喝彩 &lt;code&gt;applause()&lt;/code&gt;。不过，如果演出没有达到观众预期的话，观众会要求退款 &lt;code&gt;demandRefund()&lt;/code&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;注解&lt;/th&gt;
&lt;th&gt;通知&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@After&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通知方法会在目标方法返回或抛出异常后调用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@AfterReturning&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通知方法会在目标方法返回后调用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@AfterThrowing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通知方法会在目标方法抛出异常后调用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Around&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通知方法会将目标方法封装起来&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Before&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通知方法会在目标方法调用之前执行&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Audience 使用到了前面五个注解中的三个。&lt;code&gt;takeSeats()&lt;/code&gt; 和 &lt;code&gt;silenceCellPhones()&lt;/code&gt; 方法都用到了 &lt;code&gt;@Before&lt;/code&gt; 注解，表明它们应该在演出开始之前调用。&lt;code&gt;applause()&lt;/code&gt; 方法使用了 &lt;code&gt;@AfterReturning&lt;/code&gt; 注解，它会在演出成功返回后调用。&lt;code&gt;demandRefund()&lt;/code&gt; 方法上添加了 &lt;code&gt;@AfterThrowing&lt;/code&gt; 注解，这表明它会在抛出异常以后执行。&lt;/p&gt;
&lt;p&gt;你可能已经注意到了，所有的这些注解都给定了一个切点表达式作为它的值，同时，这四个方法的切点表达式都是相同的。其实，它们可以设置成不同的切点表达式，但是在这里，这个切点表达式就能满足所有通知方法的需求。让我们近距离看一下这个设置给通知注解的切点表达式，我们发现它会在 Performance 的 &lt;code&gt;perform()&lt;/code&gt; 方法执行时触发。&lt;/p&gt;
&lt;p&gt;相同的切点表达式我们重复了四遍，这可真不是什么光彩的事情。这样的重复让人感觉有些不对劲。如果我们只定义这个切点一次，然后每次需要的时候引用它，那么这会是一个很好的方案。&lt;/p&gt;
&lt;p&gt;幸好，我们完全可以这样做：&lt;code&gt;@Pointcut&lt;/code&gt; 注解能够在一个 &lt;code&gt;@AspectJ&lt;/code&gt; 切面内定义可重用的切点。接下来的以下程序展现了新的 Audience，现在它使用了&lt;code&gt;@Pointcut&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
/**
 * 这是一个观众类
 */
@Aspect
public class Audience {

    @Pointcut(&quot;execution(* com.syuez.Performance.perform(..))&quot;)
    public void performance() { }

    @Before(&quot;performance()&quot;)
    public void silenceCellPhones() {
        System.out.println(&quot;设置手机为静音模式&quot;);
    }

    @Before(&quot;performance()&quot;)
    public void takeSeats() {
        System.out.println(&quot;入座&quot;);
    }

    @AfterReturning(&quot;performance()&quot;)
    public void applause() {
        System.out.println(&quot;鼓掌!!!&quot;);
    }

    @AfterThrowing(&quot;performance()&quot;)
    public void demandRefund() {
        System.out.println(&quot;RNM，退钱!!!&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 Audience 中，&lt;code&gt;performance()&lt;/code&gt; 方法使用了 @Pointcut 注解。为 @Pointcut 注解设置的值是一个切点表达式，就像之前在通知注解上所设置的那样。通过在 &lt;code&gt;performance()&lt;/code&gt; 方法上添加 @Pointcut 注解，我们实际上扩展了切点表达式语言，这样就可以在任何的切点表达式中使用 &lt;code&gt;performance()&lt;/code&gt; 了，如果不这样做的话，你需要在这些地方使用那个更长的切点表达式。我们现在把所有通知注解中的长表达式都替换成了 &lt;code&gt;performance()&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;performance()&lt;/code&gt; 方法的实际内容并不重要，在这里它实际上应该是空的。其实该方法本身只是一个标识，供 @Pointcut 注解依附。&lt;/p&gt;
&lt;p&gt;需要注意的是，除了注解和没有实际操作的 &lt;code&gt;performance()&lt;/code&gt; 方法，Audience 类依然是一个 POJO。我们能够像使用其他的 Java 类那样调用它的方法，它的方法也能够独立地进行单元测试，这与其他的 Java 类并没有什么区别。Audience 只是一个 Java 类，只不过它通过注解表明会作为切面使用而已。&lt;/p&gt;
&lt;p&gt;像其他的 Java 类一样，它可以装配为 Spring 中的 bean：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Bean
public Audience audience() {
  return new Audience();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你就此止步的话，Audience 只会是 Spring 容器中的一个 bean。即便使用了 AspectJ 注解，但它并不会被视为切面，这些注解不会解析，也不会创建将其转换为切面的代理。&lt;/p&gt;
&lt;p&gt;如果你使用 JavaConfig 的话，可以在配置类的类级别上通过使用 EnableAspectJAutoProxy 注解启用自动代理功能。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class ConcertConfig {
    @Bean
    public Performance performance() {
        return new SingPerformance();
    }

    @Bean
    public Audience audience() {
        return new Audience();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一切似乎都就绪了，创建一个单元测试，然后开始一场演出吧。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class) // 让测试运行于Spring测试环 境，以便在测试开始的时候自动创建Spring的应用上下文
@ContextConfiguration(classes = ConcertConfig.class)    // 加载配置类文件
public class SingPerformanceTest {

    @Autowired
    private Performance performance;

    @Test
    public void singPerformanceTest() {
        performance.perform();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果：&lt;/p&gt;
&lt;p&gt;演砸了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/4f0cb92f-3043-4fdf-b58e-d5bd4ed3cac1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;演出成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/dd4285d7-d5a8-450e-aeae-90062fdab20a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们需要记住的是，Spring 的 AspectJ 自动代理仅仅使用 @AspectJ 作为创建切面的指导，切面依然是基于代理的。在本质上，它依然是 Spring 基于代理的切面。这一点非常重要，因为这意味着尽管使用的是 @AspectJ 注解，但我们仍然限于代理方法的调用。如果想利用 AspectJ 的所有能力，我们必须在运行时使用 AspectJ 并且不依赖 Spring 来创建基于代理的切面。&lt;/p&gt;
&lt;p&gt;到现在为止，我们的切面在定义时，使用了不同的通知方法来实现前置通知和后置通知。但是表 4.2 还提到了另外的一种通知：环绕通知 （around advice）。环绕通知与其他类型的通知有所不同，因此值得花点时间来介绍如何进行编写。&lt;/p&gt;
&lt;h4&gt;创建环绕通知&lt;/h4&gt;
&lt;p&gt;环绕通知是最为强大的通知类型。它能够让你所编写的逻辑将被通知的目标方法完全包装起来。实际上就像在一个通知方法中同时编写前置通知和后置通知。为了阐述环绕通知，我们重写 Audience 切面。这次，我们使用一个 环绕通知来代替之前多个不同的前置通知和后置通知。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
/**
 * 这是一个观众类
 */
@Aspect
public class Audience {

    @Pointcut(&quot;execution(* com.syuez.Performance.perform(..))&quot;)
    public void performance() { }

    @Around(&quot;performance()&quot;)
    public void watchPerformance(ProceedingJoinPoint jp) {
        try {
            System.out.println(&quot;设置手机为静音模式&quot;);
            System.out.println(&quot;入座&quot;);
            jp.proceed();
            System.out.println(&quot;鼓掌!!!&quot;);
        } catch (Throwable e) {
            System.out.println(&quot;RNM，退钱!!!&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这里，@Around 注解表明 &lt;code&gt;watchPerformance()&lt;/code&gt; 方法会作为 &lt;code&gt;performance()&lt;/code&gt; 切点的环绕通知。在这个通知中，观众在演出之前会将手机调至静音并就坐，演出结束后会鼓掌喝彩。像前面一样，如果演出失败的话，观众会要求退款。&lt;/p&gt;
&lt;p&gt;可以看到，这个通知所达到的效果与之前的前置通知和后置通知是一样的。但是，现在它们位于同一个方法中，不像之前那样分散在四个不同的通知方法里面。&lt;/p&gt;
&lt;p&gt;关于这个新的通知方法，你首先注意到的可能是它接受 ProceedingJoinPoint 作为参数。这个对象是必须要有的，因为你要在通知中通过它来调用被通知的方法。通知方法中可以做任何的事情，当要将控制权交给被通知的方法时，它需要调用 ProceedingJoinPoint 的 &lt;code&gt;proceed()&lt;/code&gt; 方法。&lt;/p&gt;
&lt;p&gt;需要注意的是，别忘记调用 &lt;code&gt;proceed()&lt;/code&gt; 方法。如果不调这个方法的话，那么你的通知实际上会阻塞对被通知方法的调用。有可能这就是你想要的效果，但更多的情况是你希望在某个点上执行被通知的方法。&lt;/p&gt;
&lt;p&gt;有意思的是，你可以不调用 &lt;code&gt;proceed()&lt;/code&gt; 方法，从而阻塞对被通知方法的访问，与之类似，你也可以在通知中对它进行多次调用。要这样做的一个场景就是实现重试逻辑，也就是在被通知方法失败后，进行重复尝试。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;a href=&quot;https://potoyang.gitbook.io/spring-in-action-v4/untitled&quot;&gt;第 4 章　面向切面的 Spring - Spring 实战(第四版) (gitbook.io)&lt;/a&gt; 有删改&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://segmentfault.com/a/1190000007469968&quot;&gt;彻底征服 Spring AOP 之 理论篇 - SegmentFault 思否&lt;/a&gt; 部分引用&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E9%9D%A2%E5%90%91%E5%88%87%E9%9D%A2%E7%9A%84Spring.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E9%9D%A2%E5%90%91%E5%88%87%E9%9D%A2%E7%9A%84Spring.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring中的Bean装配</title>
            <description>
            &lt;!--
author: admin
date: 2022-04-22
title: Spring中的Bean装配
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring中的Bean装配&lt;/h1&gt;
&lt;p&gt;创建应用对象之间关联关系的传统方法（通过构造器或者查找）通常会导致结构复杂的代码，这些代码很难被复用也很难进行单元测试。如果情况不严重的话，这些对象所做的事情只是超出了它应该做的范围；而最坏的情况则是，这些对象彼此之间高度耦合，难以复用和测试。&lt;/p&gt;
&lt;p&gt;在 Spring 中，对象无需自己查找或创建与其所关联的其他对象。相反，容器负责把需要相互协作的对象引用赋予各个对象。创建应用对象之间协作关系的行为通常称为装配（wiring），这也是依赖注入（DI）的本质。因为 DI 是 Spring 的最基本要素，所以在开发基于 Spring 的应用时，你随时都在使用这些技术。&lt;/p&gt;
&lt;p&gt;Spring 容器负责创建应用程序中的 bean 并通过 DI 来协调这些对象之间的关系。但是，作为开发人员，&lt;strong&gt;你需要告诉 Spring 要创建哪些 bean 并且如何将其装配在一起&lt;/strong&gt;。当描述 bean 如何进行装配 时，Spring 具有非常大的灵活性，它提供了三种主要的装配机制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 XML 中进行显式配置。&lt;/li&gt;
&lt;li&gt;在 Java 中进行显式配置。&lt;/li&gt;
&lt;li&gt;隐式的 bean 发现机制和自动装配。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;乍看上去，提供三种可选的配置方案会使 Spring 变得复杂。每种配置技术所提供的功能会有一些重叠，所以在特定的场景中，确定哪种技术最为合适就会变得有些困难。但是，不必紧张 —— 在很多场景下，选择哪种方案很大程度上就是个人喜好的问题，你尽可以选择自己最喜欢的方式。&lt;/p&gt;
&lt;p&gt;Spring 有多种可选方案来配置 bean，这是非常棒的，但有时候你必须要在其中做出选择。&lt;/p&gt;
&lt;p&gt;这方面，并没有唯一的正确答案。你所做出的选择必须要适合你和你的项目。而且，谁说我们只能选择其中的一种方案呢？Spring 的配置风格是可以互相搭配的，所以你可以选择使用 XML 装配一些 bean，使用 Spring 基于 Java 的配置（JavaConfig）来装配另一些 bean，而将剩余的 bean 让 Spring 去自动发现。&lt;/p&gt;
&lt;p&gt;即便如此，我的建议是&lt;strong&gt;尽可能地使用自动配置的机制&lt;/strong&gt;。显式配置越少越好。当你必须要显式配置 bean 的时候（比如，有些源码不是由你来维护的，而当你需要为这些代码配置 bean 的时候），我&lt;strong&gt;推荐使用&lt;/strong&gt;类型安全并且比 XML 更加强大的 &lt;strong&gt;JavaConfig&lt;/strong&gt;。最后，&lt;strong&gt;只有当你想要使用便利的 XML 命名空间，并且在 JavaConfig 中没有同样的实现时，才应该使用 XML&lt;/strong&gt;。&lt;/p&gt;
&lt;h4&gt;自动化装配 bean&lt;/h4&gt;
&lt;p&gt;Spring 从两个角度来实现自动化装配：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;组件扫描（component scanning）：Spring 会自动发现应用上下文中所创建的 bean。&lt;/li&gt;
&lt;li&gt;自动装配（autowiring）：Spring 自动满足 bean 之间的依赖。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;组件扫描和自动装配组合在一起就能发挥出强大的威力，它们能够将你的显式配置降低到最少。&lt;/p&gt;
&lt;p&gt;为了阐述组件扫描和装配，我们需要创建几个 bean，它们代表了一个音响系统中的组件。首先，要创建 CompactDisc 类，Spring 会发现它并将其创建为一个 bean。然后，会创建一个 CDPlayer 类，让 Spring 发现它，并将 CompactDiscbean 注入进来。&lt;/p&gt;
&lt;h4&gt;创建可被发现的 bean&lt;/h4&gt;
&lt;p&gt;在这个 MP3 和流式媒体音乐的时代，CD（compact disc）显得有点典雅甚至陈旧。它不像卡带机、八轨磁带、塑胶唱片那么普遍，随着以物理载体进行音乐交付的方式越来越少，CD 也变得越来越稀少了。&lt;/p&gt;
&lt;p&gt;尽管如此，CD 为我们阐述 DI 如何运行提供了一个很好的样例。如果你不将 CD 插入（注入）到 CD 播放器中，那么 CD 播放器其实是没有太大用处的。所以，可以这样说，CD 播放器依赖于 CD 才能完成它的使命。&lt;/p&gt;
&lt;p&gt;为了在 Spring 中阐述这个例子，让我们首先在 Java 中建立 CD 的概念。以下展现了 CompactDisc，它是定义 CD 的一个接口：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 一个CD唱片接口
 */
public interface CompactDisc {
    /**
     * 播放
     */
    void play();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CompactDisc 的具体内容并不重要，重要的是你将其定义为一个接口。作为接口，它定义了 CD 播放器对一盘 CD 所能进行的操作(就是播放)。它将 CD 播放器的任意实现与 CD 本身的耦合降低到了最小的程度。&lt;/p&gt;
&lt;p&gt;我们还需要一个 CompactDisc 的实现，实际上，我们可以有 CompactDisc 接口的多个实现。在本例中，我们首先会创建其中的一个实现，带有 @Component 注解的 CompactDisc 实现类 SgtPeppers：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.springframework.stereotype.Component;
/**
 * 披头士专辑
 */
@Component
public class SgtPeppers implements CompactDisc {
    private String title = &quot;Sgt. Pepper&#039;s Lonely Hearts Club Band&quot;;
    private String artist = &quot;The Beatles&quot;;

    @Override
    public void play() {
        System.out.println(&quot;Playing &quot; + title + &quot; by &quot; + artist);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;和 CompactDisc 接口一样，SgtPeppers 的具体内容并不重要。你需要注意的就是 SgtPeppers 类上使用了 &lt;code&gt;@Component&lt;/code&gt; 注解。&lt;strong&gt;这个简单的注解表明该类会作为组件类，并告知 Spring 要为这个类创建 bean&lt;/strong&gt;。没有必要显式配置 SgtPeppersbean，因为这个类使用了 @Component 注解，所以 Spring 会为你把事情处理妥当。&lt;/p&gt;
&lt;p&gt;不过，&lt;strong&gt;组件扫描默认是不启用的&lt;/strong&gt;。我们还需要显式配置一下 Spring， 从而命令它去寻找带有 @Component 注解的类，并为其创建 bean。以下的配置类展现了完成这项任务的最简洁配置，&lt;code&gt;@ComponentScan&lt;/code&gt; 注解启用了组件扫描：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
 * CD配置类
 */
@Configuration
@ComponentScan
public class CDPlayerConfig {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;类 CDPlayerConfig 通过 Java 代码定义了 Spring 的装配规则。我们只需观察一下 CDPlayerConfig 类并没有显式地声明任何 bean，只不过它使用了 &lt;code&gt;@ComponentScan&lt;/code&gt; 注解，这个注解能够在 Spring 中启用组件扫描。&lt;/p&gt;
&lt;p&gt;如果没有其他配置的话，@ComponentScan 默认会扫描与配置类相同的包。Spring 将会扫描这个包以及这个包下的所有子包，查找带有 @Component 注解的类。这样的话，就能发现 CompactDisc，并且会在 Spring 中自动为其创建一个 bean。&lt;/p&gt;
&lt;p&gt;可能有点让人难以置信，我们只创建了两个类，就能对功能进行一番尝试了。为了测试组件扫描的功能，我们创建一个简单的 JUnit 测试，它会创建 Spring 上下文，并判断 CompactDisc 是不是真的创建出来 了。CDPlayerTest 就是用来完成这项任务的，测试组件扫描能够发现 CompactDisc：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static org.junit.Assert.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {

  @Autowired
  private CompactDisc cd;

  @Test
  public void cdShouldNotBeNull() {
    assertNotNull(cd);
  }  
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CDPlayerTest 使用了 Spring 的 SpringJUnit4ClassRunner，以便在测试开始的时候自动创建 Spring 的应用上下文。注解 @ContextConfiguration 会告诉它需要在 CDPlayerConfig 中加载配置。因为 CDPlayerConfig 类中包含了 @ComponentScan，因此最终的应用上下文中应该包含 CompactDiscbean。&lt;/p&gt;
&lt;p&gt;为了证明这一点，在测试代码中有一个 CompactDisc 类型的属性，并且这个属性带有 @Autowired 注解，以便于将 CompactDiscbean 注入到测试代码之中（稍后，会讨论 @Autowired）。最后，会有一个简单的测试方法断言 cd 属性不为 null。如果它不为 null 的话，就意味着 Spring 能够发现 CompactDisc 类，自动在 Spring 上下文中将其创建为 bean 并将其注入到测试代码之中。&lt;/p&gt;
&lt;p&gt;这个代码应该能够通过测试，并以测试成功的颜色显示（在你的测试运行器中，或许会希望出现绿色）。你第一个简单的组件扫描练习就成功了！尽管我们只用它创建了一个 bean，但同样是这么少的配置能够用来发现和创建任意数量的 bean。&lt;/p&gt;
&lt;h4&gt;为组件扫描的 bean 命名&lt;/h4&gt;
&lt;p&gt;Spring 应用上下文中所有的 bean 都会给定一个 ID。在前面的例子中，尽管我们没有明确地为 &lt;code&gt;SgtPeppers&lt;/code&gt; bean 设置 ID，但 Spring 会根据类名为其指定一个 ID。具体来讲，这个 bean 所给定的 ID 为 sgtPeppers，也就是将类名的第一个字母变为小写。&lt;/p&gt;
&lt;p&gt;如果想为这个 bean 设置不同的 ID，你所要做的就是将期望的 ID 作为值传递给 @Component 注解。比如说，如果想将这个 bean 标识为 lonelyHeartsClub，那么你需要将 SgtPeppers 类的 @Component 注解配置为如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Componet(&quot;lonelyHeartsClub&quot;)
public class SgtPeppers implements CompactDisc {
  ......
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还有另外一种为 bean 命名的方式，这种方式不使用 @Component 注解，而是使用 Java 依赖注入规范（Java Dependency Injection）中所提供的 @Named 注解来为 bean 设置 ID，但是它并没有像 @Component 那样清楚地表明它是做什么的。&lt;/p&gt;
&lt;h4&gt;通过为 bean 添加注解实现自动装配&lt;/h4&gt;
&lt;p&gt;简单来说，自动装配就是让 Spring 自动满足 bean 依赖的一种方法，在满足依赖的过程中，会在 Spring 应用上下文中寻找匹配某个 bean 需求的其他 bean。为了声明要进行自动装配，我们可以借助 Spring 的 @Autowired 注解。&lt;/p&gt;
&lt;p&gt;首先创建一个&lt;code&gt;MediaPlayer&lt;/code&gt;接口&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 这是个多媒体播放器接口
 */
public interface MediaPlayer {
    /**
     * 播放
     */
    void play();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过它实现一个CD播放器&lt;code&gt;CDPlayer&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CDPlayer implements MediaPlayer {

    private CompactDisc cd;

    @Autowired
    public CDPlayer(CompactDisc cd) {
        this.cd = cd;
    }

    @Override
    public void play() {
        cd.play();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它的构造器上添加了 @Autowired 注解，这表明当 Spring 创建 CDPlayerbean 的时候，会通过这个构造器来进行实例化并且会传入一个可设置给 CompactDisc 类型的 bean，将一个 CompactDisc 注入到 CDPlayer 之中。&lt;/p&gt;
&lt;p&gt;@Autowired 注解不仅能够用在构造器上，还能用在属性的 Setter 方法上。比如说，如果 CDPlayer 有一个 &lt;code&gt;setCompactDisc()&lt;/code&gt; 方法，那 么可以采用如下的注解形式进行自动装配：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Autowired
public void setCompactDisc(CompactDisc cd){
  this.cd = cd;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 Spring 初始化 bean 之后，它会尽可能得去满足 bean 的依赖，在本例中，依赖是通过带有 @Autowired 注解的方法进行声明的，也就是 &lt;code&gt;setCompactDisc()&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;实际上，Setter 方法并没有什么特殊之处。@Autowired 注解可以用在类的任何方法上。假设 CDPlayer 类有一个 &lt;code&gt;insertDisc()&lt;/code&gt; 方法， 那么 @Autowired 能够像在 setCompactDisc() 上那样，发挥完全相同的作用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Autowired
public void insertDisc(CompactDisc cd){
  this.cd = cd;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不管是构造器、Setter 方法还是其他的方法，Spring 都会尝试满足方法参数上所声明的依赖。假如有且只有一个 bean 匹配依赖需求的话，那 么这个 bean 将会被装配进来。如果没有匹配的 bean，那么在应用上下文创建的时候，Spring 会抛出 一个异常。为了避免异常的出现，你可以将 @Autowired 的 required 属性设置为 &lt;code&gt;false&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Autowired(required=false)
public CDPlayer(CompactDisc cd) {
  this.cd = cd;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将 required 属性设置为 &lt;code&gt;false&lt;/code&gt; 时，Spring 会尝试执行自动装配，但是如果没有匹配的 bean 的话，Spring 将会让这个 bean 处于未装配的状 态。但是，把 required 属性设置为 &lt;code&gt;false&lt;/code&gt; 时，你需要谨慎对待。如果在你的代码中没有进行 &lt;code&gt;null&lt;/code&gt; 检查的话，这个处于未装配状态的属性有可能会出现 &lt;code&gt;NullPointerException&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果有多个 bean 都能满足依赖关系的话，Spring 将会抛出一个异常，表明没有明确指定要选择哪个 bean 进行自动装配。在后面的文章中，我们会进一步讨论自动装配中的歧义性。&lt;/p&gt;
&lt;p&gt;@Autowired 是 Spring 特有的注解。如果你不愿意在代码中到处使用 Spring 的特定注解来完成自动装配任务的话，那么你可以考虑将其替换为 @Inject：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import javax.inject.Inject;
import javax.inject.Named;

@Named
public class CDPlayer {
  ...

  @Inject
  public CDPlayer(CompactDisc cd) {
    this.cd = cd;
  }

  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于篇幅，不做详细讨论了。&lt;/p&gt;
&lt;h4&gt;验证自动装配&lt;/h4&gt;
&lt;p&gt;现在，我们已经在 CDPlaye r的构造器中添加了 @Autowired 注解， Spring 将把一个可分配给 CompactDisc 类型的 bean 自动注入进来。首先在&lt;code&gt;pom.xml&lt;/code&gt;中添加此次测试需要用到的依赖：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;com.github.stefanbirkner&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;system-rules&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;1.19.0&amp;lt;/version&amp;gt;
  &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在测试代码中使用 System.out.println() 是稍微有点棘手的事情。因此，使用了&lt;a href=&quot;https://stefanbirkner.github.io/system-rules/index.html&quot;&gt;System Rules (stefanbirkner.github.io)&lt;/a&gt; 库&lt;/p&gt;
&lt;p&gt;接着修改一下 CDPlayerTest，使其能够借助 CDPlayer bean 播放 CD：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.contrib.java.lang.system.SystemOutRule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.junit.Assert.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {

    @Rule
    public final SystemOutRule systemOutRule = new SystemOutRule().enableLog();

    @Autowired
    private MediaPlayer player;

    @Autowired
    private CompactDisc cd;

    @Test
    public void cdShouldNotBeNull() {
        assertNotNull(cd);
    }

    @Test
    public void play() {
        player.play();
        assertEquals(
                &quot;Playing Sgt. Pepper&#039;s Lonely Hearts Club Band by The Beatles\r\n&quot;,
                systemOutRule.getLog());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，除了注入 CompactDisc，我们还将 CDPlayerbean 注入到测试代码的 player 成员变量之中（它是更为通用的 MediaPlayer 类 型）。在 &lt;code&gt;play()&lt;/code&gt; 测试方法中，我们可以调用 CDPlayer 的 &lt;code&gt;play()&lt;/code&gt; 方法，并断言它的行为与你的预期一致。&lt;/p&gt;
&lt;p&gt;现在，你已经了解了组件扫描和自动装配的基础知识。Spring还支持显式地装配 bean，这里不在讨论，看书去吧。 ^_^&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;a href=&quot;https://potoyang.gitbook.io/spring-in-action-v4/di-2-zhang-zhuang-pei-bean&quot;&gt;第 2 章　装配 Bean - Spring 实战(第四版) (gitbook.io)&lt;/a&gt; 有删改&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84Bean%E8%A3%85%E9%85%8D.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84Bean%E8%A3%85%E9%85%8D.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring中的应用上下文</title>
            <description>
            &lt;!--
author: admin
date: 2022-04-19
title: Spring中的应用上下文
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring中的应用上下文&lt;/h1&gt;
&lt;h4&gt;Spring 容器&lt;/h4&gt;
&lt;p&gt;在基于 Spring 的应用中，你的应用对象生存于 Spring 容器（container） 中。Spring 容器负责创建对象，装配它们，配置它们并管理它们的整个生命周期，从生存到死亡（在这里，可能就是 new 到 finalize()）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/8df916d6-c702-46c2-b2ca-0458cf3274ba.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;容器是 Spring 框架的核心。Spring 容器使用 DI 管理构成应用的组件，它会创建相互协作的组件之间的关联。毫无疑问，这些对象更简单干净，更易于理解，更易于重用并且更易于进行单元测试。&lt;/p&gt;
&lt;p&gt;Spring 容器并不是只有一个。Spring 自带了多个容器实现，可以归为两种不同的类型。bean 工厂（由 &lt;code&gt;org.springframework.beans.factory.BeanFactory&lt;/code&gt; 接口定义）是最简单的容器，提供基本的 DI 支持。&lt;strong&gt;应用上下文&lt;/strong&gt;（由 &lt;code&gt;org.springframework.context.ApplicationContext&lt;/code&gt; 接口定义）基于 BeanFactory 构建，并提供应用框架级别的服务，例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。&lt;/p&gt;
&lt;p&gt;虽然我们可以在 bean 工厂和应用上下文之间任选一种，但 bean 工厂对 大多数应用来说往往太低级了，因此，应用上下文要比 bean 工厂更受欢迎。我们会把精力集中在应用上下文的使用上，不再浪费时间讨论 bean 工厂。&lt;/p&gt;
&lt;h4&gt;应用上下文&lt;/h4&gt;
&lt;p&gt;Spring 自带了多种类型的应用上下文。下面罗列的几个是你最有可能遇到的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AnnotationConfigApplicationContext&lt;/code&gt;：从一个或多个基于 Java 的配置类中加载 Spring 应用上下文。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AnnotationConfigWebApplicationContext&lt;/code&gt;：从一个或多个基于 Java 的配置类中加载 Spring Web 应用上下文。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ClassPathXmlApplicationContext&lt;/code&gt;：从类路径下的一个或多个 XML 配置文件中加载上下文定义，把应用上下文的定义文件作为类资源。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FileSystemXmlapplicationcontext&lt;/code&gt;：从文件系统下的一 个或多个 XML 配置文件中加载上下文定义。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;XmlWebApplicationContext&lt;/code&gt;：从 Web 应用下的一个或多个 XML 配置文件中加载上下文定义。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当在讨论基于 Web 的 Spring 应用时，我们会对 AnnotationConfigWebApplicationContext 和 XmlWebApplicationContext 进行更详细的讨论。现在我们先简单地使用 FileSystemXml-ApplicationContext 从文件系统中加载应用上下文或者使用 ClassPathXmlApplicationContext 从类路径中加载应用上下文。&lt;/p&gt;
&lt;p&gt;无论是从文件系统中装载应用上下文还是从类路径下装载应用上下文，将 bean 加载到 bean 工厂的过程都是相似的。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// FileSystemXmlApplicationContext
ApplicationContext context = new FileSystemXmlApplicationContext(&quot;c:/knight.xml&quot;);

// ClassPathXmlApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext(&quot;knight.xml&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 FileSystemXmlApplicationContext 和使用 ClassPathXmlApplicationContext 的区别在于：FileSystemXmlApplicationContext 在指定的文件系统路径下查找 knight.xml文件；而 ClassPathXmlApplicationContext 是在所有的类路径（包含 JAR 文件）下查找 knight.xml 文件。&lt;/p&gt;
&lt;p&gt;如果你想从 Java 配置中加载应用上下文，那么可以使用 AnnotationConfigApplicationContext：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;ApplicationContext context = new AnnotationConfigApplicationContext(com.springinaction.knights.config.KnightConfig.class);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这里没有指定加载 Spring 应用上下文所需的 XML 文 件，AnnotationConfigApplicationContext 通过一个配置类加载 bean。&lt;/p&gt;
&lt;p&gt;应用上下文准备就绪之后，我们就可以调用上下文的 getBean() 方法从 Spring 容器中获取 bean。&lt;/p&gt;
&lt;h4&gt;bean 的生命周期&lt;/h4&gt;
&lt;p&gt;在传统的 Java 应用中，bean 的生命周期很简单。使用 Java 关键字 new 进行 bean 实例化，然后该 bean 就可以使用了。一旦该 bean 不再被使用，则由 Java 自动进行垃圾回收。&lt;/p&gt;
&lt;p&gt;相比之下，Spring 容器中的 bean 的生命周期就显得相对复杂多了。正确理解 Spring bean 的生命周期非常重要，因为你或许要利用 Spring 提供的扩展点来自定义 bean 的创建过程。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/5b37da67-5fd8-4d94-adbd-42e7d04918b6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;正如你所见，在 bean 准备就绪之前，bean 工厂执行了若干启动步骤。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Spring 对 bean 进行实例化；&lt;/li&gt;
&lt;li&gt;Spring 将值和 bean 的引用注入到 bean 对应的属性中；&lt;/li&gt;
&lt;li&gt;如果 bean 实现了 BeanNameAware 接口，Spring 将 bean 的 ID 传递给 setBeanName()方法；&lt;/li&gt;
&lt;li&gt;如果 bean 实现了 BeanFactoryAware 接口，Spring 将调用 setBeanFactory() 方法，将 BeanFactory 容器实例传入；&lt;/li&gt;
&lt;li&gt;如果 bean 实现了 ApplicationContextAware 接口，Spring 将调用 setApplicationContext() 方法，将 bean 所在的应用上下文的引用传入进来；&lt;/li&gt;
&lt;li&gt;如果 bean 实现了 BeanPostProcessor 接口，Spring 将调用它们的 postProcessBefore-Initialization() 方法；&lt;/li&gt;
&lt;li&gt;如果 bean 实现了 InitializingBean 接口，Spring 将调用它们的 afterPropertiesSet() 方法。类似地，如果 bean 使用 initmethod 声明了初始化方法，该方法也会被调用；&lt;/li&gt;
&lt;li&gt;如果 bean 实现了 BeanPostProcessor 接口，Spring 将调用它们的 postProcessAfter-Initialization() 方法；&lt;/li&gt;
&lt;li&gt;此时，bean 已经准备就绪，可以被应用程序使用了，它们将一直驻留在应用上下文中，直到该应用上下文被销毁；&lt;/li&gt;
&lt;li&gt;如果 bean 实现了 DisposableBean 接口，Spring 将调用它的 destroy() 接口方法。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;同样，如果 bean 使用 destroy-method 声明了销毁方法，该方法也会被调用。现在你已经了解了如何创建和加载一个 Spring 容器。但是一个空的容器并没有太大的价值，在你把东西放进去之前，它里面什么都没有。为了从 Spring 的 DI 中受益，我们必须将应用对象装配进 Spring 容器中。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;a href=&quot;https://potoyang.gitbook.io/spring-in-action-v4/1/1.2-rong-na-ni-de-bean&quot;&gt;1.2　容纳你的 Bean - Spring 实战(第四版) (gitbook.io)&lt;/a&gt; 有删改。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8%E4%B8%8A%E4%B8%8B%E6%96%87.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8%E4%B8%8A%E4%B8%8B%E6%96%87.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring中的面向切面</title>
            <description>
            &lt;!--
author: admin
date: 2022-04-18
title: Spring中的面向切面
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring中的面向切面&lt;/h1&gt;
&lt;p&gt;DI 能够让相互协作的软件组件保持松散耦合，而面向切面编程（aspect-oriented programming，AOP）允许你把遍布应用各处的功能分离出来形成可重用的组件。&lt;/p&gt;
&lt;p&gt;面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术。系统由许多不同的组件组成，每一个组件各负责一块特定功能。除了实现自身核心的功能之外，这些组件还经常承担着额外的职责。诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去，这些系统服务通常被称为横切关注点，因为它们会跨越系统的多个组件。&lt;/p&gt;
&lt;p&gt;如果将这些关注点分散到多个组件中去，你的代码将会带来双重的复杂性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实现系统关注点功能的代码将会重复出现在多个组件中。这意味着如果你要改变这些关注点的逻辑，必须修改各个模块中的相关实现。即使你把这些关注点抽象为一个独立的模块，其他模块只是调用它的方法，但方法的调用还是会重复出现在各个模块中。&lt;/li&gt;
&lt;li&gt;组件会因为那些与自身核心业务无关的代码而变得混乱。一个向地址簿增加地址条目的方法应该只关注如何添加地址，而不应该关注它是不是安全的或者是否需要支持事务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下图展示了这种复杂性。左边的业务对象与系统级服务结合得过于紧密。每个对象不但要知道它需要记日志、进行安全控制和参与事务，还要亲自执行这些服务。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://702021806-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmcjU5gG__lBrRbUxBO%2F-LmduaHGOpFeXPhCPizn%2F-LmdvPzpLAzTurt3Pbu5%2F1.2%20%E7%B3%BB%E7%BB%9F%E5%85%B3%E6%B3%A8%E7%82%B9.jpg?alt=media&amp;amp;token=5bfd72f7-bd2e-4f91-b867-d3a1a9276aec&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;AOP 能够使这些服务模块化，并以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务，完全不需要了解涉及系统服务所带来复杂性。总之，AOP 能够确保 POJO 的简单性。&lt;/p&gt;
&lt;p&gt;如下图 所示，我们可以把切面想象为覆盖在很多组件之上的一个外壳。应用是由那些实现各自业务功能的模块组成的。借助 AOP，可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活地应用到系统中，你的核心应用甚至根本不知道它们的存在。这是一个非常强大的理念，可以将安全、事务和日志关注点与核心业务逻辑相分离。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://702021806-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmcjU5gG__lBrRbUxBO%2F-LmduaHGOpFeXPhCPizn%2F-LmdvpdFo70p29vdJfWz%2F1.3%20AOP.jpg?alt=media&amp;amp;token=1735bbc9-a37d-4fd8-8b37-42913fe112c0&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为了示范在 Spring 中如何应用切面，让我们重新回到骑士的例子，并为它添加一个切面。&lt;/p&gt;
&lt;h4&gt;AOP 应用&lt;/h4&gt;
&lt;p&gt;每一个人都熟知骑士所做的任何事情，这是因为吟游诗人用诗歌记载了骑士的事迹并将其进行传唱。假设我们需要使用吟游诗人这个服务类来记载骑士的所有事迹。创建一个吟游诗人类&lt;code&gt;Minstrel&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import java.io.PrintStream;
/**
 * 吟游诗人
 */
public class Minstrel {

    private PrintStream stream;

    public Minstrel(PrintStream stream) {
        this.stream = stream;
    }
    // 在探险之前调用
    public void singBeforeQuest() {
        stream.println(&quot;哇哇哇，这骑士是多么的勇敢啊！&quot;);
    }
    // 在探险之后调用
    public void singAfterQuest() {
        stream.println(&quot;哈哈哈，这勇敢的骑士完成了探险！&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正如你所看到的那样，Minstrel 是只有两个方法的简单类。在骑士执行每一个探险任务之前，&lt;code&gt;singBeforeQuest()&lt;/code&gt; 方法会被调用；在骑士完成探险任务之后，&lt;code&gt;singAfterQuest()&lt;/code&gt; 方法会被调用。在这两种情况下，Minstrel 都会通过一个 PrintStream 类来歌颂骑士的事迹，这个类是通过构造器注入进来的。&lt;/p&gt;
&lt;p&gt;把 Minstrel 加入你的代码中并使其运行起来，这对你来说是小事一桩。我们适当做一下调整从而让 BraveKnight 可以使用 Minstrel。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 这是一个勇敢的骑士
 */
public class BraveKnight implements Knight {
    // 找一个探险任务
    private Quest quest;
    // 找一个歌颂自己的吟游诗人
    private Minstrel minstrel;
    // 接受一个探险任务
    public BraveKnight(Quest quest, Minstrel minstrel) {
        this.quest = quest;
        this.minstrel = minstrel;
    }
    @Override
    public void embarkOnQuest() {
        minstrel.singBeforeQuest();
        quest.embark();
        minstrel.singAfterQuest();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这应该可以达到预期效果。现在，你所需要做的就是回到 Spring 配置中，声明 Minstrel bean 并将其注入到 BraveKnight 的构造器之中。在&lt;code&gt;knights.xml&lt;/code&gt;修改&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
       xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;

    &amp;lt;bean id=&quot;knight&quot; class=&quot;org.spring.BraveKnight&quot;&amp;gt;
        &amp;lt;constructor-arg ref=&quot;quest&quot; /&amp;gt;
        &amp;lt;constructor-arg ref=&quot;minstrel&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;
    &amp;lt;bean id=&quot;quest&quot; class=&quot;org.spring.SlayDragonQuest&quot;&amp;gt;
        &amp;lt;constructor-arg value=&quot;#{T(System).out}&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;bean id=&quot;minstrel&quot; class=&quot;org.spring.Minstrel&quot;&amp;gt;
        &amp;lt;constructor-arg value=&quot;#{T(System).out}&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;

&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再次运行&lt;code&gt;KnightMain&lt;/code&gt;类&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/405927f2-742a-410e-8f1a-b0a9b5c46cc7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但是管理他的吟游诗人真的是骑士职责范围内的工作吗？在我看来，吟游诗人应该做他份内的事，根本不需要骑士命令他这么做。毕竟，用诗歌记载骑士的探险事迹，这是吟游诗人的职责。为什么骑士还需要提醒吟游诗人去做他份内的事情呢？&lt;/p&gt;
&lt;p&gt;此外，因为骑士需要知道吟游诗人，所以就必须把吟游诗人注入到 BarveKnight 类中。这不仅使 BraveKnight 的代码复杂化了，而且还让我疑惑是否还需要一个不需要吟游诗人的骑士呢？如果 Minstrel 为 null 会发生什么呢？我是否应该引入一个空值校验逻辑来覆盖该场景？&lt;/p&gt;
&lt;p&gt;简单的 BraveKnight 类开始变得复杂，如果你还需要应对没有吟游诗人时的场景，那代码会变得更复杂。但利用 AOP，你可以声明吟游诗人必须歌颂骑士的探险事迹，而骑士本身并不用直接访问 Minstrel 的方法。&lt;/p&gt;
&lt;p&gt;要将 Minstrel 抽象为一个切面，你所需要做的事情就是在一个 Spring 配置文件中声明它。首先引入&lt;code&gt;AspectJ&lt;/code&gt;依赖&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;!-- 统一定义Spring版本 --&amp;gt;
&amp;lt;spring.version&amp;gt;5.3.18&amp;lt;/spring.version&amp;gt;
&amp;lt;aspectjweaver.version&amp;gt;1.9.9.1&amp;lt;/aspectjweaver.version&amp;gt;
...
...
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;aspectjweaver&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;${aspectjweaver.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更新 &lt;code&gt;knights.xml&lt;/code&gt; 文件，Minstrel 被声明为一个切面&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
       xmlns:aop=&quot;http://www.springframework.org/schema/aop&quot;
       xsi:schemaLocation=&quot;http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;

    &amp;lt;bean id=&quot;knight&quot; class=&quot;org.spring.BraveKnight&quot;&amp;gt;
        &amp;lt;constructor-arg ref=&quot;quest&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;
    &amp;lt;bean id=&quot;quest&quot; class=&quot;org.spring.SlayDragonQuest&quot;&amp;gt;
        &amp;lt;constructor-arg value=&quot;#{T(System).out}&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;
    &amp;lt;bean id=&quot;minstrel&quot; class=&quot;org.spring.Minstrel&quot;&amp;gt;
        &amp;lt;constructor-arg value=&quot;#{T(System).out}&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;aop:config&amp;gt;
        &amp;lt;aop:aspect ref=&quot;minstrel&quot;&amp;gt;
            &amp;lt;aop:pointcut id=&quot;embark&quot;
                          expression=&quot;execution(* *.embarkOnQuest(..))&quot;/&amp;gt;

            &amp;lt;aop:before pointcut-ref=&quot;embark&quot;
                        method=&quot;singBeforeQuest&quot;/&amp;gt;

            &amp;lt;aop:after pointcut-ref=&quot;embark&quot;
                       method=&quot;singAfterQuest&quot;/&amp;gt;
        &amp;lt;/aop:aspect&amp;gt;
    &amp;lt;/aop:config&amp;gt;

&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用了 Spring 的 aop 配置命名空间把 Minstrel bean 声明为一个切面。首先，需要把 Minstrel 声明为一个 bean，然后在元素中引用该 bean。为了进一步定义切面，声明 （使用）在 &lt;code&gt;embarkOnQuest()&lt;/code&gt; 方法执行前调用 Minstrel 的 &lt;code&gt;singBeforeQuest()&lt;/code&gt; 方法。这种方式被称为前置通知（before advice）。同时声明（使用）在 &lt;code&gt;embarkOnQuest()&lt;/code&gt; 方法执行后调用 &lt;code&gt;singAfterQuest()&lt;/code&gt; 方 法。这种方式被称为后置通知（after advice）。&lt;/p&gt;
&lt;p&gt;在这两种方式中，pointcut-ref 属性都引用了名字为 embark 的切入点。该切入点是在前边的元素中定义的，并配置 expression 属性来选择所应用的通知。表达式的语法采用的是 AspectJ 的切点表达式语言。&lt;/p&gt;
&lt;p&gt;现在，你无需担心不了解 AspectJ 或编写 AspectJ 切点表达式的细节，只要知道，Spring 在骑士执行探险任务前后会调用 Minstrel 的 &lt;code&gt;singBeforeQuest()&lt;/code&gt; 和 &lt;code&gt;singAfterQuest()&lt;/code&gt; 方法，这就足够了。&lt;/p&gt;
&lt;p&gt;这就是我们需要做的所有的事情！通过少量的 XML 配置，就可以把 Minstrel 声明为一个 Spring 切面。现在我们可以从这个示例中获得两个重要的观点。&lt;/p&gt;
&lt;p&gt;首先，Minstrel 仍然是一个 POJO，没有任何代码表明它要被作为一个切面使用。当我们按照上面那样进行配置后，在 Spring 的上下文中，Minstrel 实际上已经变成一个切面了。&lt;/p&gt;
&lt;p&gt;其次，也是最重要的，Minstrel 可以被应用到 BraveKnight 中，而 BraveKnight 不需要显式地调用它。实际上，BraveKnight 完全不知道 Minstrel 的存在。&lt;/p&gt;
&lt;p&gt;必须还要指出的是，尽管我们使用 Spring 魔法把 Minstrel 转变为一 个切面，但首先要把它声明为一个 Spring bean。能够为其他 Spring bean 做到的事情都可以同样应用到 Spring 切面中，例如为它们注入依赖。 应用切面来歌颂骑士可能只是有点好玩而已，但是 Spring AOP 可以做很多有实际意义的事情。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;a href=&quot;https://potoyang.gitbook.io/spring-in-action-v4/1/1.1/1.1.3-ying-yong-qie-mian&quot;&gt;1.1.3　应用切面 - Spring 实战(第四版) (gitbook.io)&lt;/a&gt; 内容有删改&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8%E5%88%87%E9%9D%A2.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8%E5%88%87%E9%9D%A2.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Spring中的依赖注入</title>
            <description>
            &lt;!--
author: admin
date: 2022-04-17
title: Spring中的依赖注入
tags: Spring
category: java
status: publish
summary: 这个叫春的框架可真难学~
--&gt;
&lt;h1&gt;Spring中的依赖注入&lt;/h1&gt;
&lt;p&gt;依赖注入(Dependency Injection，DI)这个词让人望而生畏，现在已经演变成一项复杂的编程技巧或设计模式理念。但事实证明，依赖注入并不像它听上去那么复杂。在项目中应用 DI，你会发现你的代码会变得异常简单并且更容易理解和测试。&lt;/p&gt;
&lt;p&gt;在开始前先用iDEA创建一个项目，依赖管理使用Maven，选择quickstart即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/7d4ae824-38b2-4136-aa69-530e6bbf3e6d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;DI功能是如何实现的&lt;/h4&gt;
&lt;p&gt;任何一个有实际意义的应用都会由两个或者更多的类组成，这些类相互之间进行协作来完成特定的业务逻辑。按照传统的做法，每个对象负责管理与自己相互协作的对象（即它所依赖的对象）的引用，这将会导致高度耦合和难以测试的代码。&lt;/p&gt;
&lt;p&gt;假设现在有两个接口，&lt;code&gt;Kinght&lt;/code&gt;和&lt;code&gt;Quest&lt;/code&gt;，分别代表骑士和探险任务。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 这是一个骑士接口，实现它成为骑士吧
 */
public interface Knight {
    /**
     * 开始探险
     */
    void embarkOnQuest();
}

/**
 * 这是个探险接口，实现它成为真正的探险吧！
 */
public interface Quest {
    /**
     * 开始从事...
     */
    void embark();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一个拯救少女的探险&lt;code&gt;RescueDamselQuest&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 拯救美丽少女的探险
 */
public class RescueDamselQuest implements Quest {
    public void embark() {
        System.out.println(&quot;开始了营救美丽少女的任务！&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一个拯救少女的骑士&lt;code&gt;DamselRescuingKnight&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 这是一个拯救少女的骑士
 */
public class DamselRescuingKnight implements Knight {
    // 定义一个拯救少女的任务
    private RescueDamselQuest quest;

    public DamselRescuingKnight() {
        this.quest = new RescueDamselQuest();
    }
    @Override
    public void embarkOnQuest() {
        quest.embark();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，&lt;code&gt;DamselRescuingKnight&lt;/code&gt; 在它的构造函数中自行创建了 &lt;code&gt;Rescue DamselQuest&lt;/code&gt;。这使得 &lt;code&gt;DamselRescuingKnight&lt;/code&gt; 紧密地和 &lt;code&gt;RescueDamselQuest&lt;/code&gt; 耦合到了一起，因此极大地限制了这个骑士执行探险的能力。如果一个少女需要救援，这个骑士能够召之即来。但是如果一条恶龙需要杀掉，或者一个圆桌……额……需要滚起来，那么这个骑士就爱莫能助了。&lt;/p&gt;
&lt;p&gt;耦合具有两面性（two-headed beast）。一方面，紧密耦合的代码难以测试、难以复用、难以理解，并且典型地表现出 “打地鼠” 式的 bug 特性（修复一个 bug，将会出现一个或者更多新的 bug）。另一方面，一定程度的耦合又是必须的 —— 完全没有耦合的代码什么也做不了。为了完成有实际意义的功能，不同的类必须以适当的方式进行交互。总而言之，耦合是必须的，但应当被小心谨慎地管理。&lt;/p&gt;
&lt;p&gt;通过 DI，对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系，如图 1.1 所示，依赖关系将被自动注入到需要它们的对象当中去。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://702021806-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmcjU5gG__lBrRbUxBO%2F-LmdoyDRaFKt3J31DhX9%2F-LmdqJwp0NDL5J9OuUwr%2F1.1%20%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5.jpg?alt=media&amp;amp;token=1119c49e-7676-4d08-8bba-1a2ecb9242ce&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为了展示这一点，让我们看一看以下的 &lt;code&gt;BraveKnight&lt;/code&gt;，这个骑士不仅勇敢，而且能挑战任何形式的探险：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 这是一个勇敢的骑士
 */
public class BraveKnight implements Knight {
    // 定义一个探险任务
    private Quest quest;
    // 接受一个探险任务
    public BraveKnight(Quest quest) {
        this.quest = quest;
    }
    @Override
    public void embarkOnQuest() {
        quest.embark();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以看到，不同于之前的 &lt;code&gt;DamselRescuingKnight&lt;/code&gt;，&lt;code&gt;BraveKnight&lt;/code&gt; 没有自行创建探险任务，而是在构造的时候把探险任务作为构造器参数传入。这是依赖注入的方式之一，即&lt;strong&gt;构造器注入&lt;/strong&gt;（constructor injection）。&lt;/p&gt;
&lt;p&gt;更重要的是，传入的探险类型是 &lt;code&gt;Quest&lt;/code&gt;，也就是所有探险任务都必须实现的一个接口。所以，&lt;code&gt;BraveKnight&lt;/code&gt; 能够响应 &lt;code&gt;RescueDamselQuest&lt;/code&gt;、&lt;code&gt;SlayDragonQuest&lt;/code&gt;、&lt;code&gt;MakeRoundTableRounderQuest&lt;/code&gt;(让圆桌滚起来) 等任意的 &lt;code&gt;Quest&lt;/code&gt; 实现。&lt;/p&gt;
&lt;p&gt;这里的要点是 &lt;code&gt;BraveKnight&lt;/code&gt; 没有与任何特定的 &lt;code&gt;Quest&lt;/code&gt; 实现发生耦合。对它来说，被要求挑战的探险任务只要实现了 &lt;code&gt;Quest&lt;/code&gt; 接口，那么具体是哪种类型的探险就无关紧要了。这就是 DI 所带来的最大收益 —— 松耦合。如果一个对象只通过接口（而不是具体实现或初始化过程）来表明依赖关系，那么这种依赖就能够在对象本身毫不知情的情况下，用不同的具体实现进行替换。&lt;/p&gt;
&lt;p&gt;对依赖进行替换的一个最常用方法就是在测试的时候使用 &lt;code&gt;mock&lt;/code&gt; 实现。我们无法充分地测试 &lt;code&gt;DamselRescuingKnight&lt;/code&gt;，因为它是紧耦合的；但是可以轻松地测试 &lt;code&gt;BraveKnight&lt;/code&gt;，只需给它一个 &lt;code&gt;Quest&lt;/code&gt; 的 &lt;code&gt;mock&lt;/code&gt; 实现即可。&lt;/p&gt;
&lt;p&gt;首先在&lt;code&gt;pom.xml&lt;/code&gt;添加&lt;code&gt;mock&lt;/code&gt;依赖，然后创建测试类&lt;code&gt;BraveKnightTest&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.mockito&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;mockito-core&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;4.4.0&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static org.mockito.Mockito.*;
import org.junit.Test;

public class BraveKnightTest {
    @Test
    public void knightShouldEmbarkOnQuest() {
        Quest mockQuest = mock(Quest.class);
        BraveKnight knight = new BraveKnight(mockQuest);
        knight.embarkOnQuest();
        verify(mockQuest, times(1)).embark();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你可以使用 &lt;code&gt;mock&lt;/code&gt; 框架 &lt;code&gt;Mockito&lt;/code&gt; 去创建一个 &lt;code&gt;Quest&lt;/code&gt; 接口的 &lt;code&gt;mock&lt;/code&gt; 实现。通过这个 &lt;code&gt;mock&lt;/code&gt; 对象，就可以创建一个新的 &lt;code&gt;BraveKnight&lt;/code&gt; 实例，并通过构造器注入这个 &lt;code&gt;mock Quest&lt;/code&gt;。当调用 &lt;code&gt;embarkOnQuest()&lt;/code&gt; 方法时， 你可以要求 &lt;code&gt;Mockito&lt;/code&gt;框架验证 &lt;code&gt;Quest&lt;/code&gt; 的 &lt;code&gt;mock&lt;/code&gt; 实现的 &lt;code&gt;embark()&lt;/code&gt; 方法仅仅被调用了一次。&lt;/p&gt;
&lt;h4&gt;将 &lt;code&gt;Quest&lt;/code&gt; 注入到 &lt;code&gt;Knight&lt;/code&gt; 中&lt;/h4&gt;
&lt;p&gt;让我们欢迎&lt;code&gt;Spring&lt;/code&gt;登场吧，在&lt;code&gt;pom.xml&lt;/code&gt;中添加&lt;code&gt;Spring&lt;/code&gt;框架依赖&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;properties&amp;gt;
    &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
    &amp;lt;maven.compiler.source&amp;gt;1.7&amp;lt;/maven.compiler.source&amp;gt;
    &amp;lt;maven.compiler.target&amp;gt;1.7&amp;lt;/maven.compiler.target&amp;gt;
    &amp;lt;spring.version&amp;gt;5.3.18&amp;lt;/spring.version&amp;gt; &amp;lt;!-- 统一定义版本 --&amp;gt;
&amp;lt;/properties&amp;gt;
...
...
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-beans&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在 &lt;code&gt;BraveKnight&lt;/code&gt; 类可以接受你传递给它的任意一种 &lt;code&gt;Quest&lt;/code&gt; 的实现，但该怎样把特定的 &lt;code&gt;Query&lt;/code&gt; 实现传给它呢？假设，希望 &lt;code&gt;BraveKnight&lt;/code&gt; 所要进行探险任务是杀死一只怪龙，&lt;code&gt;SlayDragonQuest&lt;/code&gt; 也许是挺合适的。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import java.io.PrintStream;

/**
 * 屠龙探险
 */
public class SlayDragonQuest implements Quest{
    private PrintStream stream;

    public SlayDragonQuest(PrintStream stream) {
        this.stream = stream;
    }
    @Override
    public void embark() {
        stream.println(&quot;踏上弑龙之旅!&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以看到，&lt;code&gt;SlayDragonQuest&lt;/code&gt; 实现了 &lt;code&gt;Quest&lt;/code&gt; 接口，这样它就适合注入到 &lt;code&gt;BraveKnight&lt;/code&gt; 中去了。与其他的Java入门样例有所不同，&lt;code&gt;SlayDragonQuest&lt;/code&gt;没有使用 &lt;code&gt;System.out.println()&lt;/code&gt;，而是在构造方法中请求一个更为通用的 &lt;code&gt;PrintStream&lt;/code&gt;。这里最大的问题在于，我们该如何将 &lt;code&gt;SlayDragonQuest&lt;/code&gt; 交给 &lt;code&gt;BraveKnight&lt;/code&gt; 呢？又如何将 &lt;code&gt;PrintStream&lt;/code&gt; 交给 &lt;code&gt;SlayDragonQuest&lt;/code&gt; 呢？&lt;/p&gt;
&lt;p&gt;创建应用组件之间协作的行为通常称为装配（wiring）。&lt;code&gt;Spring&lt;/code&gt; 有多种装配 &lt;code&gt;bean&lt;/code&gt; 的方式，采用 &lt;code&gt;XML&lt;/code&gt; 是很常见的一种装配方式。以下是一个简单的 &lt;code&gt;Spring&lt;/code&gt;配置文件：&lt;code&gt;knights.xml&lt;/code&gt;，该配置文件将 &lt;code&gt;BraveKnight&lt;/code&gt;、&lt;code&gt;SlayDragonQuest&lt;/code&gt; 和 &lt;code&gt;PrintStream&lt;/code&gt; 装配到了 一起。&lt;/p&gt;
&lt;p&gt;在项目的&lt;code&gt;src\main&lt;/code&gt;目录下创建&lt;code&gt;resource&lt;/code&gt;目录，然后&lt;code&gt;resource&lt;/code&gt;下创建&lt;code&gt;META-INF\spring&lt;/code&gt;目录，最后在&lt;code&gt;spring&lt;/code&gt;下创建&lt;code&gt;knights.xml&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
       xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&amp;gt;

    &amp;lt;bean id=&quot;knight&quot; class=&quot;org.spring.BraveKnight&quot;&amp;gt;
        &amp;lt;constructor-arg ref=&quot;quest&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;bean id=&quot;quest&quot; class=&quot;org.spring.SlayDragonQuest&quot;&amp;gt;
        &amp;lt;constructor-arg value=&quot;#{T(System).out}&quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;

&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这里，&lt;code&gt;BraveKnight&lt;/code&gt; 和 &lt;code&gt;SlayDragonQuest&lt;/code&gt; 被声明为 &lt;code&gt;Spring&lt;/code&gt; 中的 &lt;code&gt;bean&lt;/code&gt;。就 &lt;code&gt;BraveKnight bean&lt;/code&gt; 来讲，它在构造时传入了对 &lt;code&gt;SlayDragonQuest bean&lt;/code&gt; 的引用，将其作为构造器参数。同时， &lt;code&gt;SlayDragonQuest bean&lt;/code&gt; 的声明使用了 &lt;code&gt;Spring&lt;/code&gt; 表达式语言（Spring Expression Language），将 &lt;code&gt;System.out&lt;/code&gt;（这是一个 &lt;code&gt;PrintStream&lt;/code&gt;）传入到了 &lt;code&gt;SlayDragonQuest&lt;/code&gt; 的构造器中。&lt;/p&gt;
&lt;p&gt;尽管 &lt;code&gt;BraveKnight&lt;/code&gt; 依赖于 &lt;code&gt;Quest&lt;/code&gt;，但是它并不知道传递给它的是什么类型的 &lt;code&gt;Quest&lt;/code&gt;，也不知道这个 &lt;code&gt;Quest&lt;/code&gt; 来自哪里。与之类似，&lt;code&gt;SlayDragonQuest&lt;/code&gt; 依赖于 &lt;code&gt;PrintStream&lt;/code&gt;，但是在编码时它并不需要知道这个 &lt;code&gt;PrintStream&lt;/code&gt; 是什么样子的。只有 &lt;code&gt;Spring&lt;/code&gt; 通过它的配置，能够了解这些组成部分是如何装配起来的。这样的话，就可以在不改变所依赖的类的情况下，修改依赖关系。&lt;/p&gt;
&lt;p&gt;现在已经声明了 BraveKnight 和 Quest 的关系，接下来我们只需要装载 XML 配置文件，并把应用启动起来。&lt;/p&gt;
&lt;h4&gt;观察它如何工作&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;Spring&lt;/code&gt; 通过应用上下文（&lt;code&gt;Application Context&lt;/code&gt;）装载 &lt;code&gt;bean&lt;/code&gt; 的定义并把它们组装起来。&lt;code&gt;Spring&lt;/code&gt; 应用上下文全权负责对象的创建和组装。&lt;code&gt;Spring&lt;/code&gt; 自带了多种应用上下文的实现，它们之间主要的区别仅仅在于如何加载配置。 因为 &lt;code&gt;knights.xml&lt;/code&gt; 中的 &lt;code&gt;bean&lt;/code&gt; 是使用 XML 文件进行配置的，所以选择 &lt;code&gt;ClassPathXmlApplicationContext&lt;/code&gt; 作为应用上下文相对是比较合适的。该类加载位于应用程序类路径下的一个或多个 &lt;code&gt;XML&lt;/code&gt; 配置文件。&lt;code&gt;KnightMain.java&lt;/code&gt; 加载包含 &lt;code&gt;Knight&lt;/code&gt; 的 &lt;code&gt;Spring&lt;/code&gt; 上下文，&lt;code&gt;main()&lt;/code&gt; 方法调用 &lt;code&gt;ClassPathXmlApplicationContext&lt;/code&gt; 加载 &lt;code&gt;knights.xml&lt;/code&gt;，并获得 &lt;code&gt;Knight&lt;/code&gt; 对象的引用。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import org.springframework.context.support.ClassPathXmlApplicationContext;

public class KnightMain {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext(&quot;META-INF/spring/knights.xml&quot;);
        Knight knight = context.getBean(Knight.class);
        knight.embarkOnQuest();
        context.close();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 &lt;code&gt;main()&lt;/code&gt; 方法基于 &lt;code&gt;knights.xml&lt;/code&gt; 文件创建了 &lt;code&gt;Spring&lt;/code&gt; 应用上下文。随后它调用该应用上下文获取一个 ID 为 &lt;code&gt;knight&lt;/code&gt; 的 &lt;code&gt;bean&lt;/code&gt;。得到&lt;code&gt;Knight&lt;/code&gt; 对象的引用后，只需简单调用 &lt;code&gt;embarkOnQuest()&lt;/code&gt; 方法就可以执行所赋予的探险任务了。&lt;strong&gt;注意这个类完全不知道我们的英雄骑士接受哪种探险任务(是的，它只知道&lt;code&gt;kinght&lt;/code&gt;是个&lt;code&gt;Kinght&lt;/code&gt;接口实现的骑士类)，而且完全没有意识到这是由 &lt;code&gt;BraveKnight&lt;/code&gt; 来执行的&lt;/strong&gt;。只有 &lt;code&gt;knights.xml&lt;/code&gt; 文件知道哪个骑士执行哪种探险任务。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;a href=&quot;https://potoyang.gitbook.io/spring-in-action-v4/&quot;&gt;Spring 实战（第 4 版） - Spring 实战(第四版) (gitbook.io)&lt;/a&gt; 有删改。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Spring%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>我是一个平庸的程序员</title>
            <description>
            &lt;!--
author: 萨达哈利路亚
date: 2022-04-12
title: 我是一个平庸的程序员
tags: 编程
category: 转载
status: publish
summary: 我愿意接受平庸，因为这是唯一正确的选择。
--&gt;
&lt;h1&gt;我是一个平庸的程序员&lt;/h1&gt;
&lt;p&gt;英文原文链接：&lt;a href=&quot;https://dev.to/sobolevn/i-am-a-mediocre-developer--30hn&quot;&gt;I am a mediocre developer - DEV Community&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;译文链接：&lt;a href=&quot;https://juejin.cn/post/6844903788990431239&quot;&gt;【译】我是一个平庸的程序员 - 掘金 (juejin.cn)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我个人认为有一些程序员就是天才，他们可以轻而易举地创造一些了不起的软件产品。因为这群天才的存在，我们对这个行业充满了期待。但是有一个悲伤的事实是：不是每一个人都是大师级的程序员。&lt;/p&gt;
&lt;p&gt;实际上这就是我，一个平庸的程序员。这篇文章将指导你，作为一个非天才程序员，如何在这个行业中生存。&lt;/p&gt;
&lt;h3&gt;我一直用google搜索最简单的技术&lt;/h3&gt;
&lt;p&gt;我记不住很多东西。比如，标准库里的函数和方法，参数的位置，依赖的包名，样板代码等等。&lt;/p&gt;
&lt;p&gt;所以，我需要用google搜索，每天如此。我也从旧的项目里复用代码，有时也从&lt;strong&gt;StackOverflow&lt;/strong&gt;或者&lt;strong&gt;GitHub&lt;/strong&gt;上复制别人的代码。是的，我是一个&lt;a href=&quot;https://link.juejin.cn?target=https%3A%2F%2Fmeta.stackoverflow.com%2Fquestions%2F361904%2Fwhat-is-stack-overflow-driven-development&quot; title=&quot;https://meta.stackoverflow.com/questions/361904/what-is-stack-overflow-driven-development&quot;&gt;面向&lt;em&gt;StackOverflow&lt;/em&gt;编程&lt;/a&gt;的程序员。&lt;/p&gt;
&lt;p&gt;但我不是一个人在战斗，很多很多程序员都像我一样。&lt;strong&gt;Ruby on Rails&lt;/strong&gt;的作者曾经发过一个很火的&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Ftwitter.com%2Fdhh%2Fstatus%2F834146806594433025&quot; title=&quot;https://twitter.com/dhh/status/834146806594433025&quot;&gt;twitter&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/3/3/1694410512edeac5~tplv-t2oaga2asx-zoom-in-crop-mark:1304:0:0:0.awebp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这样子写代码有什么不好呢？有如下几点坏处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你可能从别人那拷贝的，是糟糕的设计或者很烂的代码。&lt;/li&gt;
&lt;li&gt;容易形成一个坏的心态：如果不能从网上搜索到你想到的，那么就是“休斯顿，我们遇到麻烦了”。&lt;/li&gt;
&lt;li&gt;如果没有网了，那么你就无法工作了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但是，我并不认为这是一个大问题。它甚至可以作为你的秘密武器。我有几点建议减轻这些负面影响。&lt;/p&gt;
&lt;h3&gt;生存法则1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用IDE的代码自动补全和提示，你就不用去搜索语言的基础用法了。&lt;/li&gt;
&lt;li&gt;记住你在什么地方或使用什么方法解决了这个问题。下一次遇到同样的问题，找出来看一下就可以了。&lt;/li&gt;
&lt;li&gt;你提交到项目中的所有代码，都应该在之后进行分析、重构和评审。这样做，就不会用糟糕的代码降低项目的质量，而是帮助它获得快速的解决方案。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;保持事情的简单性&lt;/h4&gt;
&lt;p&gt;我们说什么，机器做什么。有时候，机器做了错误的事情，仅仅是因为我们下了错误的指令。因此软件开发中的主要问题，不是机器，而是开发人员的思维能力。这种能力是有限的。所以，我们作为一个平庸的程序员，不要浪费脑子去创建复杂的抽象设计、编写晦涩的算法或不可读的长代码块。&lt;a href=&quot;https://link.juejin.cn?target=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FKISS_principle&quot; title=&quot;https://en.wikipedia.org/wiki/KISS_principle&quot;&gt;保持简单性&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;然而，我们怎么区分这段代码是简单的还是复杂的？我们需要使用&lt;code&gt;WTFs/Minute&lt;/code&gt;方法去衡量代码质量。（译者注：WTF = What the Fuck）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/practicaldev/image/fetch/s--RTnc6j1i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i2.wp.com/commadot.com/wp-content/uploads/2009/02/wtf.png%3Fresize%3D550%252C433&quot; alt=&quot;wtf/minute code quality&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这条规则非常简单易懂。你发现代码中有一些你看不懂的东西，那它就是复杂的。你应该怎么做？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重写代码，让人看起来清晰&lt;/li&gt;
&lt;li&gt;提供文档&lt;/li&gt;
&lt;li&gt;在最难懂的地方添加注释。但是记住，过多的注释本身，就是代码的坏味道。（译者注：参见&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fblog.csdn.net%2FLoveLion%2Farticle%2Fdetails%2F9301691&quot; title=&quot;https://blog.csdn.net/LoveLion/article/details/9301691&quot;&gt;22种代码味道&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;生存法则2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用正确的变量名、函数名和类名&lt;/li&gt;
&lt;li&gt;确保你代码每一部分只做一件事件&lt;/li&gt;
&lt;li&gt;优先使用纯函数，而不是常规函数&lt;/li&gt;
&lt;li&gt;优先使用常规函数，而不是类&lt;/li&gt;
&lt;li&gt;只在非常必要的情况下，才使用回调&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;我不相信我自己&lt;/h4&gt;
&lt;p&gt;一些开发者已经证明他们能提交高质量的代码。像下面这位女神：Margaret Hamilton，阿波罗计划的首席软件工程师。这张图里，她旁边的等身高的纸，就是为登月任务编写的代码。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/practicaldev/image/fetch/s--G4sZPf_1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://cdn8.openculture.com/2017/08/29205628/margaret-hamilton-mit-apollo-code_0.jpg&quot; alt=&quot;Margaret Hamilton&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不过，但于我而言，无论我编写任何代码，我不相信我自己。即使是做项目里最简单的部分，我也能把事件搞得非常糟糕，可能包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语言错误&lt;/li&gt;
&lt;li&gt;逻辑错误&lt;/li&gt;
&lt;li&gt;设计错误&lt;/li&gt;
&lt;li&gt;演示错误&lt;/li&gt;
&lt;li&gt;安全性错误&lt;/li&gt;
&lt;li&gt;WTF错误（我最喜欢的）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;世界上并没有一本关于“如何编写无bug代码”的魔法师，所以这些错误都是正常的。所有的软件都有bug，处理掉它就是了。&lt;/p&gt;
&lt;p&gt;实际上，任何人都不允许编写带有&lt;strong&gt;明显错误&lt;/strong&gt;的代码。所以至少我们应该尝试做到这一点。我应该怎样保护我自己的项目呢？下面有几条建议。&lt;/p&gt;
&lt;h3&gt;生存法则3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;编写测试用例，编写大量的测试用例。大到集成测试，小到单元测试。在每次拉取请求前执行CI持续集成，这将减少你的一些逻辑错误。&lt;/li&gt;
&lt;li&gt;使用静态数据类型或者可选静态类型。例如，我们在python中使用mypy，在javascript中使用flow（译者注：现在应该使用Typescript）。这样做的好处是：清晰的设计和编译时类型检查。&lt;/li&gt;
&lt;li&gt;使用自动样式检测工具。每种语言都有大量的样式检查工具。&lt;/li&gt;
&lt;li&gt;使用质量检测工具。有些工具在你的代码库上运行一些复杂的启发式算法来检测不同的问题，比如这行内部逻辑太多，不需要这个类，这个函数太复杂。&lt;/li&gt;
&lt;li&gt;检阅你的代码。在合并到主分支之前代码，有时候在合并之后也需要review。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://link.juejin.cn?target=https%3A%2F%2Fwemake.services%2Fmeta%2Frsdp%2Faudits%2F&quot; title=&quot;https://wemake.services/meta/rsdp/audits/&quot;&gt;花钱让别人审核你的代码&lt;/a&gt;。这样做有相当大的好处，因为当别的程序员第一次看你的代码时，很容易看出不一致的地方和糟糕的代码设计。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;不应该只在我的电脑上有效&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/practicaldev/image/fetch/s--h027pWFE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.ca.com/us/products/excuse-free-testing/worked-fine-on-my-machine/_jcr_content/page/adaptiveimage_855e.img.620.high.jpg/1484844865861.jpg&quot; alt=&quot;Works on my machine&quot; /&gt;&lt;/p&gt;
&lt;p&gt;差不多十年前，当我的团队开发完第一个大型软件项目时，我们将其作为java源文件发布。在我们呈现给客户前的几个小时，它在目标服务器上编译失败了。这算是个大事故。虽然最终我们修复好了并运行起来，但这是个终身难忘的经历。&lt;/p&gt;
&lt;p&gt;这是因为在构建管道里，有着大量的配置和大量的复杂性。我们没有能力去正确管理该系统的复杂性。从那天开始，为了减少这一步的复杂性，我尝试将程序打包在独立的环境中，并在实际部署之前在此环境中进行测试。&lt;/p&gt;
&lt;p&gt;这几年，随着&lt;strong&gt;docker&lt;/strong&gt;（以及一般的容器）的兴起，这件事情开始变得简单起来。&lt;strong&gt;docker&lt;/strong&gt;允许你在完全相同的独立环境下进行开发、测试和生产上线。采用这种方式，你不会遗留任何重要的事情。&lt;/p&gt;
&lt;p&gt;不好吗？说说我自己，在搭建服务、初始化配置或者链接一些东西的时候，我总会遗漏掉一部分。因为有许多东西需要记住。幸运的是，我们仍然可以实现自动化。有许多很棒的工具可以进行自动化部署。如：&lt;a href=&quot;https://link.juejin.cn?target=https%3A%2F%2Fwww.terraform.io%2F&quot; title=&quot;https://www.terraform.io/&quot;&gt;terraform&lt;/a&gt;, &lt;a href=&quot;https://link.juejin.cn?target=https%3A%2F%2Fwww.ansible.com%2F&quot; title=&quot;https://www.ansible.com/&quot;&gt;ansible&lt;/a&gt;, and &lt;a href=&quot;https://link.juejin.cn?target=https%3A%2F%2Fwww.packer.io%2F&quot; title=&quot;https://www.packer.io/&quot;&gt;packer&lt;/a&gt;。查看他们的文档，找到适合你的工具。&lt;/p&gt;
&lt;p&gt;我也尝试设置CI/CD进行持续集成和持续部署。当在测试和部署的自动化构建失败时，我会收到报告通知。&lt;/p&gt;
&lt;h3&gt;生存法则4&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;一切使用自动化部署&lt;/li&gt;
&lt;li&gt;使用&lt;strong&gt;docker&lt;/strong&gt;作为开发、测试和生产环境&lt;/li&gt;
&lt;li&gt;使用部署工具&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;在部署应用后，我仍然不相信我自己&lt;/h4&gt;
&lt;p&gt;最后，我的应用已经在生产环境上线了，它已经在运行了。我可以打个小盹儿了，什么事儿都不会发生。等一下，不，一切都将崩溃。是的，一切。&lt;/p&gt;
&lt;p&gt;实际上，有一些工具可以很容易的发现和修复现在问题。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://link.juejin.cn?target=https%3A%2F%2Fsentry.io%2Fwelcome%2F&quot; title=&quot;https://sentry.io/welcome/&quot;&gt;Sentry&lt;/a&gt;. 任何一个你的用户产生异常时，你都会收到通知。Sentry已经支持几乎所有的开发语言。&lt;/li&gt;
&lt;li&gt;各式各样的&lt;a href=&quot;https://link.juejin.cn?target=https%3A%2F%2Fpapertrailapp.com%2F&quot; title=&quot;https://papertrailapp.com/&quot;&gt;服务&lt;/a&gt;和&lt;a href=&quot;https://link.juejin.cn?target=https%3A%2F%2Fwww.elastic.co%2Fcn%2Fproducts%2Fkibana&quot; title=&quot;https://www.elastic.co/cn/products/kibana&quot;&gt;工具&lt;/a&gt;，可以将多个程序的日志收集到一个地方。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://link.juejin.cn?target=https%3A%2F%2Fgrafana.com%2F&quot; title=&quot;https://grafana.com/&quot;&gt;服务监控&lt;/a&gt;.你可以对CPU、硬盘、网络和存储器配置监控。你甚至可以在用户实际压垮你的服务之前，确定需要进行服务扩容的时间。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;简单来说，我们需要在生产环境上进行监控。有的时候你需要上述所有工具，有的时候你只需要一部分。要根据自己的情况进行判断。&lt;/p&gt;
&lt;h4&gt;持续学习&lt;/h4&gt;
&lt;p&gt;哇，有好多需要学的东西。但这就是我的生存方式。如果我们想写好代码，我们就需要持续学习。成功路上没有捷径，你需要做的就是学习如何一天比一天好。&lt;/p&gt;
&lt;p&gt;总结来说，我们需要理解两个基本原则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每个人都会遇到问题。最关键的是，我们对这些问题，准备好了吗，准备到什么程度。&lt;/li&gt;
&lt;li&gt;我们可以把问题的根源降低到可接受的程度。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这与你的思维能力或心态无关。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;作者：萨达哈利路亚&lt;br /&gt;
链接：&lt;a href=&quot;https://juejin.cn/post/6844903788990431239&quot;&gt;https://juejin.cn/post/6844903788990431239&lt;/a&gt;&lt;br /&gt;
来源：稀土掘金&lt;br /&gt;
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E5%B9%B3%E5%BA%B8%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%98.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E5%B9%B3%E5%BA%B8%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%98.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>在Windows中使用Cygwin编译Redis</title>
            <description>
            &lt;!--
author: admin
date: 2022-04-11
title: 在Windows中使用Cygwin编译Redis
tags: 编译
category: Windows
status: publish
summary: 在Windows中使用Cygwin编译Redis
--&gt;
&lt;h1&gt;在Windows中使用Cygwin编译Redis&lt;/h1&gt;
&lt;p&gt;因为现在&lt;code&gt;Redis&lt;/code&gt;官方已经停止释放出&lt;code&gt;Windows&lt;/code&gt;版本了，使用最新版本需要自己编译。&lt;/p&gt;
&lt;p&gt;本文在Cygwin环境下编译&lt;code&gt;Redis-6.2.6&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;安装&lt;code&gt;Cygwin&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;首先安装&lt;code&gt;Cygwin&lt;/code&gt;，在官网下载后直接点击安装&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/a1c180d2c7d046caa324c793f9b91dff.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;下一页&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/089be0e73b9e4a98929f03636355491a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;下一页&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/aa991662d4b34c67af6ccc1e085d72c2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;选择安装目录，点击下一页&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/6cc9533442fe460fbc9dc0d5438f8e1e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;选择本地Package目录，点击下一页&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/3601298c833f4ce8abd1964d58642b09.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;默认选择下一页&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/b8697d942ecd40db965fe6b446ea982c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;选择软件源&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/2d80f6df04cd464c848136ce1a6d39fb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;下一页&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/1b2d2f003efb417fa9d91ec6646b8e8b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;选择需要的软件，一般选择&lt;code&gt;make, gcc-core, gcc-g++, libgcc1, libgccpp1, pkg-config&lt;/code&gt;，看具体需要了。默认是&lt;code&gt;skip&lt;/code&gt;的，选择最新的版本即可。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/0d292195e00540a1a2de8bd1b29ca4e6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;下一页&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/cc60ec52f8564e64af0cffe306757c56.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;下载软件包&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/e4a94b93acd149e6856991151f7a0bcc.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol start=&quot;11&quot;&gt;
&lt;li&gt;点击完成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;打开&lt;code&gt;Cygwin&lt;/code&gt;后默认是在&lt;code&gt;/home/user&lt;/code&gt;，就跟&lt;code&gt;Linux&lt;/code&gt;用户一样。&lt;/p&gt;
&lt;h4&gt;编译&lt;code&gt;Redis&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;编译redis源码要先修改cygwin一个文件，否则无法编译。找到&lt;code&gt;cygwin&lt;/code&gt;的&lt;code&gt;/usr/include&lt;/code&gt;目录下，找到&lt;code&gt;dlfcn.h&lt;/code&gt;，找到箭头指向的两行，屏蔽掉，默认是没有屏蔽的。修改完后&lt;strong&gt;保存&lt;/strong&gt;关闭。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/1004907f1ada406cb7d426e5941265da.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将下载的&lt;code&gt;redis&lt;/code&gt;压缩文件解压，放入到&lt;code&gt;cygwin&lt;/code&gt;的&lt;code&gt;home&lt;/code&gt;的用户目录下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/bc6f2f39-1da3-42df-887f-2d2cb013ddec.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入redis的deps目录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/cc3e6891-e100-4537-9f7d-77f2883ca96e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;执行  &lt;code&gt;make hiredis linenoise lua hdr_histogram&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;执行完后，&lt;code&gt;cd ..&lt;/code&gt;到上级目录，执行&lt;code&gt;make&lt;/code&gt;命令&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/a2d023dd-a071-4147-87e7-6fb22253feb6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;make&lt;/code&gt;成功后，执行&lt;code&gt;make install&lt;/code&gt;，等待编译安装完成后进入到src目录，看看exe文件，就是我们编译好的redis相关文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/d33010b9-1d1b-4c4a-9426-14b62f13bc24.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将这些文件单独复制到一个文件夹，比如&lt;code&gt;RedisWindows&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;还有这两个文件，我们都可以拷贝在一起:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img-blog.csdnimg.cn/9ee708532aff4a3dbf4b6bf49ec65141.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVzdHNvbmdz,size_20,color_FFFFFF,t_70,g_se,x_16&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;把cygwin1.dll也拷贝一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/53052b11-44ca-445e-87e9-f0fbef732a9d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;放在一起：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/99766330-0987-4629-83a4-9b23b43aeec9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;运行&lt;code&gt;redis-server.exe&lt;/code&gt;和&lt;code&gt;redis-cli.exe&lt;/code&gt;，在&lt;code&gt;redis-cli.exe&lt;/code&gt;里设置&lt;code&gt;set&lt;/code&gt;一个值，再&lt;code&gt;get&lt;/code&gt;一个值，如果和下面一样，说明已经安装成功。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e370a42b-cc91-48bd-af83-c99da09c87d0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：&lt;a href=&quot;https://blog.csdn.net/bestsongs/article/details/123205240&quot;&gt;windows下cygwin编译redis 6.2.6源码教程，再也不用担心没有高版本redis版本了（附win版本）_bestsongs的博客-CSDN博客&lt;/a&gt; 内容有删改&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%9C%A8Windows%E4%B8%AD%E4%BD%BF%E7%94%A8Cygwin%E7%BC%96%E8%AF%91Redis.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%9C%A8Windows%E4%B8%AD%E4%BD%BF%E7%94%A8Cygwin%E7%BC%96%E8%AF%91Redis.html</guid>
                                               <category>Windows</category>
                                    </item>
                <item>
            <title>Java单元测试Junit</title>
            <description>
            &lt;!--
author: admin
date: 2022-04-10
title: Java单元测试Junit
tags: 单元测试
category: java
status: publish
summary: 面向测试编程
--&gt;
&lt;h1&gt;Java单元测试Junit&lt;/h1&gt;
&lt;p&gt;什么是单元测试呢？单元测试就是针对最小的功能单元编写测试代码。&lt;strong&gt;Java程序最小的功能单元是方法，因此，对Java程序进行单元测试就是针对单个Java方法的测试&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;单元测试有什么好处呢？在学习单元测试前，我们可以先了解一下测试驱动开发。&lt;/p&gt;
&lt;p&gt;所谓测试驱动开发，是指先编写接口，紧接着编写测试。编写完测试后，我们才开始真正编写实现代码。在编写实现代码的过程中，一边写，一边测，什么时候测试全部通过了，那就表示编写的实现完成了：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ascii&quot;&gt;    编写接口
     │
     ▼
    编写测试
     │
     ▼
┌─&amp;gt; 编写实现
│    │
│ N  ▼
└── 运行测试
     │ Y
     ▼
    任务完成&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这就是&lt;code&gt;TDD&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;当然，这是一种理想情况。大部分情况是我们已经编写了实现代码，需要对已有的代码进行测试。&lt;/p&gt;
&lt;p&gt;我们先通过一个示例来看如何编写测试。假定我们编写了一个计算阶乘的类，它只有一个静态方法来计算阶乘：&lt;/p&gt;
&lt;p&gt;$n!=1×2×3×...×n$&lt;/p&gt;
&lt;p&gt;首先在IDE中创建项目，这里使用Maven&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/b8591613-4c73-4a37-8ebf-16a7e3b236eb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;pom.xml&lt;/code&gt;中会自动添加&lt;code&gt;junit&lt;/code&gt;依赖&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/4f9b04d4-cf5e-4c0b-95c8-021dec5edaab.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在项目中添加一个新类&lt;code&gt;Factorial.java&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class Factorial {
    public static long fact(long n) {
        if(n == 0) {
            return 1;
        }

        long r = 1;
        for(long i = 1; i &amp;lt;=n; i++) {
            r = r * i;
        }
        return r;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;test&lt;/code&gt;目录中创建&lt;code&gt;FactorialTest.java&lt;/code&gt;，&lt;code&gt;test&lt;/code&gt;目录就是用来做测试的，IDE会帮我们自动创建好：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class FactorialTest {
    @Test
    public void testFact() {
        assertEquals(1,Factorial.fact(1));
        assertEquals(2,Factorial.fact(2));
        assertEquals(6,Factorial.fact(3));
        assertEquals(362880,Factorial.fact(10));
        assertEquals(2432902008176640000L, Factorial.fact(20));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;核心测试方法&lt;code&gt;testFact()&lt;/code&gt;加上了&lt;code&gt;@Test&lt;/code&gt;注解，这是JUnit要求的，它会把带有&lt;code&gt;@Test&lt;/code&gt;的方法识别为测试方法。在测试方法内部，我们用&lt;code&gt;assertEquals(1, Factorial.fact(1))&lt;/code&gt;表示，期望&lt;code&gt;Factorial.fact(1)&lt;/code&gt;返回&lt;code&gt;1&lt;/code&gt;。&lt;code&gt;assertEquals(expected, actual)&lt;/code&gt;是最常用的测试方法，它在&lt;code&gt;Assertion&lt;/code&gt;类中定义。&lt;code&gt;Assertion&lt;/code&gt;还定义了其他断言方法，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assertTrue()&lt;/code&gt;: 期待结果为&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assertFalse()&lt;/code&gt;: 期待结果为&lt;code&gt;false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assertNotNull()&lt;/code&gt;: 期待结果为非&lt;code&gt;null&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assertArrayEquals()&lt;/code&gt;: 期待结果为数组并与期望数组每个元素的值均相等&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;运行单元测试非常简单。选中&lt;code&gt;testFact()&lt;/code&gt;方法鼠标右键点击后在弹出的菜单栏选中运行&lt;code&gt;testFact&lt;/code&gt;即可。方法有很多种，可以自己去尝试。&lt;/p&gt;
&lt;p&gt;在Failure Trace中，JUnit会告诉我们详细的错误结果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/c91fbf2b-ce89-4dc6-9b43-00e8395d0b64.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那就是这行代码没通过测试&lt;code&gt;assertEquals(362880,Factorial.fact(10));&lt;/code&gt;，此时，我们要么修正实现代码，要么修正测试代码，直到测试通过为止。&lt;/p&gt;
&lt;p&gt;单元测试可以确保单个方法按照正确预期运行，如果修改了某个方法的代码，只需确保其对应的单元测试通过，即可认为改动正确。此外，测试代码本身就可以作为示例代码，用来演示如何调用该方法。&lt;/p&gt;
&lt;p&gt;使用JUnit进行单元测试，我们可以使用断言（&lt;code&gt;Assertion&lt;/code&gt;）来测试期望结果，可以方便地组织和运行测试，并方便地查看测试结果。&lt;/p&gt;
&lt;p&gt;在编写单元测试的时候，我们要遵循一定的规范：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;单元测试代码本身必须非常简单，能一下看明白，决不能再为测试代码编写测试；&lt;/li&gt;
&lt;li&gt;每个单元测试应当互相独立，不依赖运行的顺序；&lt;/li&gt;
&lt;li&gt;是测试时不但要覆盖常用测试用例，还要特别注意测试边界条件，例如输入为&lt;code&gt;0&lt;/code&gt;，&lt;code&gt;null&lt;/code&gt;，空字符串&lt;code&gt;&quot;&quot;&lt;/code&gt;等情况。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;a href=&quot;https://www.liaoxuefeng.com/wiki/1252599548343744/1304048154181666&quot;&gt;编写JUnit测试 - 廖雪峰的官方网站 (liaoxuefeng.com)&lt;/a&gt; 有删改&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Java%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95Junit.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Java%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95Junit.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Java回调函数</title>
            <description>
            &lt;!--
author: admin
date: 2022-04-1
title: Java回调函数
tags: 编程
category: java
status: publish
summary: 补补基础(手动狗头！)
--&gt;
&lt;h1&gt;Java回调函数&lt;/h1&gt;
&lt;h3&gt;&lt;strong&gt;什么是回调函数？&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;在英语中，&lt;code&gt;callback&lt;/code&gt;是回电话的意思，&lt;strong&gt;而在开发中callback叫回调函数&lt;/strong&gt;，其实就是回电话的意思，&lt;code&gt;callback&lt;/code&gt;这一个单词已经把“回调”的神表达出来了，作为开发者，完全可以按回电话的场景来理解回调函数。&lt;/p&gt;
&lt;p&gt;仔细咂摸一下，回电话这个场景与回调函数的使用场景何其像啊！点击一个按钮或链接，然后等待数据的返回和界面的刷新，具体等待多久也不确定，可能0.1秒就响应了，也可能5秒之后才响应，总之，响应时间是不确定的，不能让人一直等着，这不就像等一个回电话的过程吗？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下面用实际代码模拟上面的沟通过程&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个过程涉及到我和朋友两个实体类，&lt;code&gt;Me&lt;/code&gt;类代表我，&lt;code&gt;Friend&lt;/code&gt;类代表我的朋友。&lt;/p&gt;
&lt;p&gt;因为我要打电话给朋友和接朋友电话通知，所以&lt;code&gt;Me&lt;/code&gt;类有三个功能，也叫行为：给朋友打电话，我们用&lt;code&gt;callFriend(Friend)&lt;/code&gt;来表示；接到朋友的通知，我们用&lt;code&gt;noticeMe()&lt;/code&gt;函数来表示；在给朋友打电话和接朋友电话通知之间的这一段时间，我在忙其它的事情，我们用&lt;code&gt;doOtherthing()&lt;/code&gt;函数来表示。&lt;/p&gt;
&lt;p&gt;朋友要先给其他小伙伴约时间然后给我打电话，所以&lt;code&gt;Friend&lt;/code&gt;类也有个函数&lt;code&gt;order()&lt;/code&gt;定义他和其它小伙伴的预约过程，约好时间之后又要给我回电话，所以还要有个参数为&lt;code&gt;Me&lt;/code&gt;的对象。&lt;/p&gt;
&lt;p&gt;代码如下，这些代码是可以直接运行的，并且用数字对程序的运行顺序做了标记。&lt;/p&gt;
&lt;h4&gt;Me.java的代码&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * @author lannd
 */
public class Me {
    /**
     * 给朋友打电话
     * @param friend
     * @throws InterruptedException
     */
    public void callFriend(Friend friend) throws InterruptedException {
        System.out.println(&quot;1、我打电话给朋友，让他去约时间&quot;);
        friend.order(this);
        doOtherThing();
    }
    /**
     * 通知我
     */
    public void noticeMe() {
        System.out.println(&quot;6、我收到了朋友的通知&quot;);
    }
    /**
     * 忙别的事情去了
     */
    public void doOtherThing() {
        System.out.println(&quot;3. 我去忙其它的事情...&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Friend.java的代码&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static java.lang.Thread.sleep;
/**
 * @author lannd
 */
public class Friend {
    /**
     * 和其他小伙伴约好时间后通知我
     * @param me
     * @throws InterruptedException
     */
    public void order(final Me me) throws InterruptedException {
        System.out.println(&quot;2. 朋友接到电话说：我现在就和其他小伙伴约时间，请稍等...&quot;);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(&quot;4. 朋友正在电话联系中...&quot;);
                    sleep(5000);
                    System.out.println(&quot;5. 朋友约好了，准备给我回电话&quot;);
                    me.noticeMe();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;对这段代码加以说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;函数中使用线程是为了模拟朋友的沟通过程，在实际应用中多为耗时的操作。&lt;/li&gt;
&lt;li&gt;“朋友”沟通过程与“我”忙其它事情是并行的，“我”并没有等待他。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;strong&gt;最后，写主程序&lt;/strong&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * @author lannd
 */
public class Main {
    public static void main(String[] args) throws InterruptedException {
        // 创建【我和朋友】对象
        Me me = new Me();
        Friend friend = new Friend();

        // 给朋友打电话
        me.callFriend(friend);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;看运行结果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/9f132cf3-e2be-4ab5-b170-d9ee1088f92b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从结果中可以看出，我联系朋友之后就忙其它事情了，朋友接到电话之后就去沟通，我也不知道他会沟通多久，朋友在沟通完之后通知我，就完事了。&lt;/p&gt;
&lt;p&gt;从主程序可以看出，只有我调用了&lt;code&gt;callFriend()&lt;/code&gt;，朋友怎么沟通、怎么回电话，我都不关注，他只需要持有“我”对象的引用就行了，需要通知我时，就通过引用调用&lt;code&gt;noticeMe()&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;有主动调用过程，也有callBack的过程，这个实例已经展示了回调的全部了，但显然并不完美&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;试想以下场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;老板安排给员工一个任务，要求完成工作后通知老板&lt;/li&gt;
&lt;li&gt;父母安排你飞机落地后，给他们报个平安。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;生活中这样的场景非常多，在实际项目中也是，但是在项目中，我们在每个类中定义一个类似&lt;code&gt;noticeMe()&lt;/code&gt;这样的类就不高明了，因为违背了“复用”的编程原则，虽然实现了回调的功能，但并不是真正意义上的回调函数。&lt;/p&gt;
&lt;p&gt;所以我们可以对“通知”这一行为进一步抽象，对行为抽象当然要使用接口。&lt;/p&gt;
&lt;p&gt;具体代码如下:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * 定义接收通知接口，所有参与者可实现此接口以接收通知
 * @author lannd
 */
public interface CallBack {
    /**
     * 参与者可以实现接收通知的细节
     * @param friendName
     */
    public void receiveNotice(String friendName);
}
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里有个参数&lt;code&gt;friendName&lt;/code&gt;，朋友通知我的时候，可以通过这个参数传递一些信息，比如他的名字。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Me.java&lt;/code&gt;实现这个接口后的代码&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/**
 * @author lannd
 */
public class Me implements CallBack {
    /**
     * 给朋友打电话
     * @param friend
     * @throws InterruptedException
     */
    public void callFriend(Friend friend) throws InterruptedException {
        System.out.println(&quot;1、我打电话给朋友，让他去约时间&quot;);
        friend.order(this);
        doOtherThing();
    }
    /**
     * 忙别的事情去了
     */
    public void doOtherThing() {
        System.out.println(&quot;3. 我去忙其它的事情...&quot;);
    }

    /**
     * 参与者可以实现接收通知的细节
     *
     * @param friendName
     */
    @Override
    public void receiveNotice(String friendName) {
        System.out.println(&quot;6、我收到了朋友 -&quot;+friendName+ &quot;- 的通知&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Friend.java&lt;/code&gt;做相应的修改后：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static java.lang.Thread.sleep;
/**
 * @author lannd
 */
public class Friend {
    /**
     * 和其他小伙伴约好时间后通知我
     * @param callBack
     * @throws InterruptedException
     */
    public void order(final CallBack callBack) throws InterruptedException {
        System.out.println(&quot;2. 朋友接到电话说：我现在就和其他小伙伴约时间，请稍等...&quot;);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(&quot;4. 朋友正在电话联系中...&quot;);
                    sleep(5000);
                    System.out.println(&quot;5. 朋友约好了，准备给我回电话&quot;);
                    callBack.receiveNotice(&quot;张三&quot;);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Main.java&lt;/code&gt;的代码不需要调整。&lt;/p&gt;
&lt;p&gt;运行结果和前面基本是一致的，我只是增加了一个参数，大家也可以体会一个这个参数带来的便利。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/cce25430-219c-4ac5-b43d-526ab4199619.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;多了一个接口的定义，代码好像更多了。但在实际扩展当中却更方便了，比如说，老板要接收员工的通知，老板类实现这个接口就完事了；父母要等待孩子的通知，父母类实现这个接口就可以。换句话说，所有要扩展接收通知的类，只要实现这个接口就具备了接收通知的功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这样的好处是代码得到了复用，极大的方便了扩展。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过接口来实现回调的功能，这才是真正意义上的回调函数。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/330542410&quot;&gt;如何理解java的回调函数？ - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Java%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Java%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>优于 select 的 epoll</title>
            <description>
            &lt;!--
author: admin
date: 2022-03-30
title: 优于 select 的 epoll
tags: 网络编程
category: C
status: publish
summary: select和epoll的比较
--&gt;
&lt;h1&gt;优于 select 的 epoll&lt;/h1&gt;
&lt;h3&gt;epoll 理解及应用&lt;/h3&gt;
&lt;p&gt;select 复用方法由来已久，因此，利用该技术后，无论如何优化程序性能也无法同时介入上百个客户端。这种 select 方式并不适合以 web 服务器端开发为主流的现代开发环境，所以需要学习 Linux 环境下的 epoll&lt;/p&gt;
&lt;h4&gt;基于 select 的 I/O 复用技术速度慢的原因&lt;/h4&gt;
&lt;p&gt;上一篇实现了基于 select 的 I/O 复用技术服务端，其中有不合理的设计如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调用 select 函数后常见的针对所有文件描述符的循环语句&lt;/li&gt;
&lt;li&gt;每次调用 select 函数时都需要向该函数传递监视对象信息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上述两点可以从&lt;code&gt;echo_selectserv.c&lt;/code&gt;得到确认，调用 select 函数后，并不是把发生变化的文件描述符单独集中在一起，而是通过作为监视对象的 fd_set 变量的变化，找出发生变化的文件描述符（54,56行），因此无法避免针对所有监视对象的循环语句。而且，作为监视对象的 fd_set 会发生变化，所以调用 select 函数前应该复制并保存原有信息，并在每次调用 select 函数时传递新的监视对象信息。&lt;/p&gt;
&lt;p&gt;select 性能上最大的弱点是：每次传递监视对象信息，准确的说，select 是监视套接字变化的函数。而套接字是操作系统管理的，所以 select 函数要借助操作系统才能完成功能。select 函数的这一缺点可以通过如下方式弥补：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;仅向操作系统传递一次监视对象，监视范围或内容发生变化时只通知发生变化的事项&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这样就无需每次调用 select 函数时都想操作系统传递监视对象信息，但是前提操作系统支持这种处理方式。Linux 的支持方式是 epoll ，Windows 的支持方式是 IOCP。&lt;/p&gt;
&lt;h4&gt;select 也有优点&lt;/h4&gt;
&lt;p&gt;select 的兼容性比较高，这样就可以支持很多的操作系统，不受平台的限制，使用 select 函数满足以下两个条件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务器接入者少&lt;/li&gt;
&lt;li&gt;程序应该具有兼容性&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;实现 epoll 时必要的函数和结构体&lt;/h4&gt;
&lt;p&gt;能够克服 select 函数缺点的 epoll 函数具有以下优点，这些优点正好与之前的 select 函数缺点相反。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无需编写以监视状态变化为目的的针对所有文件描述符的循环语句&lt;/li&gt;
&lt;li&gt;调用对应于 select 函数的 epoll_wait 函数时无需每次传递监视对象信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是 epoll 函数的功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;epoll_create：创建保存 epoll 文件描述符的空间&lt;/li&gt;
&lt;li&gt;epoll_ctl：向空间注册并注销文件描述符&lt;/li&gt;
&lt;li&gt;epoll_wait：与 select 函数类似，等待文件描述符发生变化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;select 函数中为了保存监视对象的文件描述符，直接声明了 fd_set 变量，但 epoll 方式下的操作系统负责保存监视对象文件描述符，因此需要向操作系统请求创建保存文件描述符的空间，此时用的函数就是 epoll_create 。&lt;/p&gt;
&lt;p&gt;此外，为了添加和删除监视对象文件描述符，select 方式中需要 FD_SET、FD_CLR 函数。但在 epoll 方式中，通过 epoll_ctl 函数请求操作系统完成。最后，select 方式下调用 select 函数等待文件描述符的变化，而 epoll_wait 调用 epoll_wait 函数。还有，select 方式中通过 fd_set 变量查看监视对象的状态变化，而 epoll 方式通过如下结构体 epoll_event 将发生变化的文件描述符单独集中在一起。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;struct epoll_event
{
    __uint32_t events;
    epoll_data_t data;
};
typedef union epoll_data {
    void *ptr;
    int fd;
    __uint32_t u32;
    __uint64_t u64;
} epoll_data_t;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;声明足够大的 epoll_event 结构体数组候，传递给 epoll_wait 函数时，发生变化的文件描述符信息将被填入数组。因此，无需像 select 函数那样针对所有文件描述符进行循环。&lt;/p&gt;
&lt;h4&gt;epoll_create&lt;/h4&gt;
&lt;p&gt;epoll 是从 Linux 的 2.5.44 版内核开始引入的。下面是 epoll_create 函数的原型：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;sys/epoll.h&amp;gt;
int epoll_create(int size);
/*
成功时返回 epoll 的文件描述符，失败时返回 -1
size：epoll 实例的大小
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;调用 epoll_create 函数时创建的文件描述符保存空间称为「epoll 例程」，但有些情况下名称不同，需要稍加注意。通过参数 size 传递的值决定 epoll 例程的大小，但该值只是向操作系统提出的建议。换言之，size 并不用来决定 epoll 的大小，而仅供操作系统参考。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Linux 2.6.8 之后的内核将完全传入 epoll_create 函数的 size 函数，因此内核会根据情况调整 epoll 例程大小。但是本书程序并没有忽略 size&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;epoll_create 函数创建的资源与套接字相同，也由操作系统管理。因此，该函数和创建套接字的情况相同，也会返回文件描述符，也就是说返回的文件描述符主要用于区分 epoll 例程。需要终止时，与其他文件描述符相同，也要调用 close 函数。&lt;/p&gt;
&lt;h4&gt;epoll_ctl&lt;/h4&gt;
&lt;p&gt;生成例程后，应在其内部注册监视对象文件描述符，此时使用 epoll_ctl 函数。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;sys/epoll.h&amp;gt;
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
/*
成功时返回 0 ，失败时返回 -1
epfd：用于注册监视对象的 epoll 例程的文件描述符
op：用于制定监视对象的添加、删除或更改等操作
fd：需要注册的监视对象文件描述符
event：监视对象的事件类型
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;与其他 epoll 函数相比，该函数看起来有些复杂，但通过调用语句就很容易理解，假设按照如下形式调用 epoll_ctl 函数：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;epoll_ctl(A,EPOLL_CTL_ADD,B,C);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二个参数 EPOLL_CTL_ADD 意味着「添加」，上述语句有如下意义：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;epoll 例程 A 中注册文件描述符 B ，主要目的是为了监视参数 C 中的事件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;再介绍一个调用语句。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;epoll_ctl(A,EPOLL_CTL_DEL,B,NULL);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述语句中第二个参数意味这「删除」，有以下含义：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;从 epoll 例程 A 中删除文件描述符 B&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;从上述示例中可以看出，从监视对象中删除时，不需要监视类型，因此向第四个参数可以传递为 NULL&lt;/p&gt;
&lt;p&gt;下面是第二个参数的含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EPOLL_CTL_ADD：将文件描述符注册到 epoll 例程&lt;/li&gt;
&lt;li&gt;EPOLL_CTL_DEL：从 epoll 例程中删除文件描述符&lt;/li&gt;
&lt;li&gt;EPOLL_CTL_MOD：更改注册的文件描述符的关注事件发生情况&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;epoll_event 结构体用于保存事件的文件描述符结合。但也可以在 epoll 例程中注册文件描述符时，用于注册关注的事件。该函数中 epoll_event 结构体的定义并不显眼，因此通过掉英语剧说明该结构体在 epoll_ctl 函数中的应用。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;struct epoll_event event;
...
event.events=EPOLLIN;//发生需要读取数据的情况时
event.data.fd=sockfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,sockfd,&amp;amp;event);
...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述代码将 epfd 注册到 epoll 例程 epfd 中，并在需要读取数据的情况下产生相应事件。接下来给出 epoll_event 的成员 events 中可以保存的常量及所指的事件类型。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EPOLLIN：需要读取数据的情况&lt;/li&gt;
&lt;li&gt;EPOLLOUT：输出缓冲为空，可以立即发送数据的情况&lt;/li&gt;
&lt;li&gt;EPOLLPRI：收到 OOB 数据的情况&lt;/li&gt;
&lt;li&gt;EPOLLRDHUP：断开连接或半关闭的情况，这在边缘触发方式下非常有用&lt;/li&gt;
&lt;li&gt;EPOLLERR：发生错误的情况&lt;/li&gt;
&lt;li&gt;EPOLLET：以边缘触发的方式得到事件通知&lt;/li&gt;
&lt;li&gt;EPOLLONESHOT：发生一次事件后，相应文件描述符不再收到事件通知。因此需要向 epoll_ctl 函数的第二个参数传递 EPOLL_CTL_MOD ，再次设置事件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可通过位运算同时传递多个上述参数。&lt;/p&gt;
&lt;h4&gt;epoll_wait&lt;/h4&gt;
&lt;p&gt;下面是函数原型：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;sys/epoll.h&amp;gt;
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
/*
成功时返回发生事件的文件描述符，失败时返回 -1
epfd : 表示事件发生监视范围的 epoll 例程的文件描述符
events : 保存发生事件的文件描述符集合的结构体地址值
maxevents : 第二个参数中可以保存的最大事件数
timeout : 以 1/1000 秒为单位的等待时间，传递 -1 时，一直等待直到发生事件
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该函数调用方式如下。需要注意的是，第二个参数所指缓冲需要动态分配。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int event_cnt;
struct epoll_event *ep_events;
...
ep_events=malloc(sizeof(struct epoll_event)*EPOLL_SIZE);//EPOLL_SIZE是宏常量
...
event_cnt=epoll_wait(epfd,ep_events,EPOLL_SIZE,-1);
...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;调用函数后，返回发生事件的文件描述符，同时在第二个参数指向的缓冲中保存发生事件的文件描述符集合。因此，无需像 select 一样插入针对所有文件描述符的循环。&lt;/p&gt;
&lt;h4&gt;基于 epoll 的回声服务器端&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;arpa/inet.h&amp;gt;
#include &amp;lt;sys/socket.h&amp;gt;
#include &amp;lt;sys/epoll.h&amp;gt;

#define BUF_SIZE 100
#define EPOLL_SIZE 50
void error_handling(char *message);

int main(int argc, char *argv[])
{
    int serv_sock, clnt_sock;
    struct sockaddr_in serv_adr, clnt_adr;
    socklen_t adr_sz;
    int str_len, i;
    char buf[BUF_SIZE];

    struct epoll_event *ep_events;
    struct epoll_event event;
    int epfd, event_cnt;

    if (argc != 2)
    {
        printf(&quot;Usage : %s &amp;lt;port&amp;gt; \n&quot;, argv[0]);
        exit(1);
    }
    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    memset(&amp;amp;serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(atoi(argv[1]));

    if (bind(serv_sock, (struct sockaddr *)&amp;amp;serv_adr, sizeof(serv_adr)) == -1)
        error_handling(&quot;bind() error&quot;);
    if (listen(serv_sock, 5) == -1)
        error_handling(&quot;listen() error&quot;);

    epfd = epoll_create(EPOLL_SIZE); //可以忽略这个参数，填入的参数为操作系统参考
    ep_events = malloc(sizeof(struct epoll_event) * EPOLL_SIZE);

    event.events = EPOLLIN; //需要读取数据的情况
    event.data.fd = serv_sock;
    epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &amp;amp;event); //例程epfd 中添加文件描述符 serv_sock，目的是监听 enevt 中的事件

    while (1)
    {
        event_cnt = epoll_wait(epfd, ep_events, EPOLL_SIZE, -1); //获取改变了的文件描述符，返回数量
        if (event_cnt == -1)
        {
            puts(&quot;epoll_wait() error&quot;);
            break;
        }

        for (i = 0; i &amp;lt; event_cnt; i++)
        {
            if (ep_events[i].data.fd == serv_sock) //客户端请求连接时
            {
                adr_sz = sizeof(clnt_adr);
                clnt_sock = accept(serv_sock, (struct sockaddr *)&amp;amp;clnt_adr, &amp;amp;adr_sz);
                event.events = EPOLLIN;
                event.data.fd = clnt_sock; //把客户端套接字添加进去
                epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &amp;amp;event);
                printf(&quot;connected client : %d \n&quot;, clnt_sock);
            }
            else //是客户端套接字时
            {
                str_len = read(ep_events[i].data.fd, buf, BUF_SIZE);
                if (str_len == 0)
                {
                    epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL); //从epoll中删除套接字
                    close(ep_events[i].data.fd);
                    printf(&quot;closed client : %d \n&quot;, ep_events[i].data.fd);
                }
                else
                {
                    write(ep_events[i].data.fd, buf, str_len);
                }
            }
        }
    }
    close(serv_sock);
    close(epfd);

    return 0;
}

void error_handling(char *message)
{
    fputs(message, stderr);
    fputc(&#039;\n&#039;, stderr);
    exit(1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译运行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;gcc echo_epollserv.c -o serv
./serv 9190&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;总结一下 epoll 的流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;epoll_create 创建一个保存 epoll 文件描述符的空间，可以没有参数&lt;/li&gt;
&lt;li&gt;动态分配内存，给将要监视的 epoll_wait&lt;/li&gt;
&lt;li&gt;利用 epoll_ctl 控制 添加 删除，监听事件&lt;/li&gt;
&lt;li&gt;利用 epoll_wait 来获取改变的文件描述符,来执行程序&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;select 和 epoll 的区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每次调用 select 函数都会向操作系统传递监视对象信息，浪费大量时间&lt;/li&gt;
&lt;li&gt;epoll 仅向操作系统传递一次监视对象，监视范围或内容发生变化时只通知发生变化的事项&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;条件触发和边缘触发&lt;/h3&gt;
&lt;p&gt;学习 epoll 时要了解条件触发（Level Trigger）和边缘触发（Edge Trigger）。&lt;/p&gt;
&lt;h4&gt;条件触发和边缘触发的区别在于发生事件的时间点&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;条件触发的特性&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;条件触发方式中，只要输入缓冲有数据就会一直通知该事件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;例如，服务器端输入缓冲收到 50 字节数据时，服务器端操作系统将通知该事件（注册到发生变化的文件描述符）。但是服务器端读取 20 字节后还剩下 30 字节的情况下，仍会注册事件。也就是说，条件触发方式中，只要输入缓冲中还剩有数据，就将以事件方式再次注册。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;边缘触发特性&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;边缘触发中输入缓冲收到数据时仅注册 1 次该事件。即使输入缓冲中还留有数据，也不会再进行注册。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;掌握条件触发的事件特性&lt;/h4&gt;
&lt;p&gt;下面代码修改自 &lt;code&gt;echo_epollserv.c&lt;/code&gt;。epoll 默认以条件触发的方式工作，因此可以通过该示例验证条件触发的特性。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;arpa/inet.h&amp;gt;
#include &amp;lt;sys/socket.h&amp;gt;
#include &amp;lt;sys/epoll.h&amp;gt;

#define BUF_SIZE 2
#define EPOLL_SIZE 50
void error_handling(char *message);

int main(int argc, char *argv[])
{
    int serv_sock, clnt_sock;
    struct sockaddr_in serv_adr, clnt_adr;
    socklen_t adr_sz;
    int str_len, i;
    char buf[BUF_SIZE];

    struct epoll_event *ep_events;
    struct epoll_event event;
    int epfd, event_cnt;

    if (argc != 2)
    {
        printf(&quot;Usage : %s &amp;lt;port&amp;gt; \n&quot;, argv[0]);
        exit(1);
    }
    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    memset(&amp;amp;serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(atoi(argv[1]));

    if (bind(serv_sock, (struct sockaddr *)&amp;amp;serv_adr, sizeof(serv_adr)) == -1)
        error_handling(&quot;bind() error&quot;);
    if (listen(serv_sock, 5) == -1)
        error_handling(&quot;listen() error&quot;);

    epfd = epoll_create(EPOLL_SIZE); //可以忽略这个参数，填入的参数为操作系统参考
    ep_events = malloc(sizeof(struct epoll_event) * EPOLL_SIZE);

    event.events = EPOLLIN; //需要读取数据的情况
    event.data.fd = serv_sock;
    epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &amp;amp;event); //例程epfd 中添加文件描述符 serv_sock，目的是监听 enevt 中的事件

    while (1)
    {
        event_cnt = epoll_wait(epfd, ep_events, EPOLL_SIZE, -1); //获取改变了的文件描述符，返回数量
        if (event_cnt == -1)
        {
            puts(&quot;epoll_wait() error&quot;);
            break;
        }

        puts(&quot;return epoll_wait&quot;);
        for (i = 0; i &amp;lt; event_cnt; i++)
        {
            if (ep_events[i].data.fd == serv_sock) //客户端请求连接时
            {
                adr_sz = sizeof(clnt_adr);
                clnt_sock = accept(serv_sock, (struct sockaddr *)&amp;amp;clnt_adr, &amp;amp;adr_sz);
                event.events = EPOLLIN;
                event.data.fd = clnt_sock; //把客户端套接字添加进去
                epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &amp;amp;event);
                printf(&quot;connected client : %d \n&quot;, clnt_sock);
            }
            else //是客户端套接字时
            {
                str_len = read(ep_events[i].data.fd, buf, BUF_SIZE);
                if (str_len == 0)
                {
                    epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL); //从epoll中删除套接字
                    close(ep_events[i].data.fd);
                    printf(&quot;closed client : %d \n&quot;, ep_events[i].data.fd);
                }
                else
                {
                    write(ep_events[i].data.fd, buf, str_len);
                }
            }
        }
    }
    close(serv_sock);
    close(epfd);

    return 0;
}

void error_handling(char *message)
{
    fputs(message, stderr);
    fputc(&#039;\n&#039;, stderr);
    exit(1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的代码把调用 read 函数时使用的缓冲大小缩小到了 4 个字节，插入了验证 epoll_wait 调用次数的验证函数。减少缓冲大小是为了阻止服务器端一次性读取接收的数据。换言之，调用 read 函数后，输入缓冲中仍有数据要读取，而且会因此注册新的事件并从 epoll_wait 函数返回时将循环输出「return epoll_wait」字符串。&lt;/p&gt;
&lt;p&gt;编译运行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;gcc echo_EPLTserv.c -o serv
./serv 9190&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面的代码是修改后的边缘触发方式的代码，仅仅是把上面的代码改为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt; event.events = EPOLLIN | EPOLLET;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;arpa/inet.h&amp;gt;
#include &amp;lt;sys/socket.h&amp;gt;
#include &amp;lt;sys/epoll.h&amp;gt;

#define BUF_SIZE 2
#define EPOLL_SIZE 50
void error_handling(char *message);

int main(int argc, char *argv[])
{
    int serv_sock, clnt_sock;
    struct sockaddr_in serv_adr, clnt_adr;
    socklen_t adr_sz;
    int str_len, i;
    char buf[BUF_SIZE];

    struct epoll_event *ep_events;
    struct epoll_event event;
    int epfd, event_cnt;

    if (argc != 2)
    {
        printf(&quot;Usage : %s &amp;lt;port&amp;gt; \n&quot;, argv[0]);
        exit(1);
    }
    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    memset(&amp;amp;serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(atoi(argv[1]));

    if (bind(serv_sock, (struct sockaddr *)&amp;amp;serv_adr, sizeof(serv_adr)) == -1)
        error_handling(&quot;bind() error&quot;);
    if (listen(serv_sock, 5) == -1)
        error_handling(&quot;listen() error&quot;);

    epfd = epoll_create(EPOLL_SIZE); //可以忽略这个参数，填入的参数为操作系统参考
    ep_events = malloc(sizeof(struct epoll_event) * EPOLL_SIZE);

    event.events = EPOLLIN; //需要读取数据的情况
    event.data.fd = serv_sock;
    epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &amp;amp;event); //例程epfd 中添加文件描述符 serv_sock，目的是监听 enevt 中的事件

    while (1)
    {
        event_cnt = epoll_wait(epfd, ep_events, EPOLL_SIZE, -1); //获取改变了的文件描述符，返回数量
        if (event_cnt == -1)
        {
            puts(&quot;epoll_wait() error&quot;);
            break;
        }

        puts(&quot;return epoll_wait&quot;);
        for (i = 0; i &amp;lt; event_cnt; i++)
        {
            if (ep_events[i].data.fd == serv_sock) //客户端请求连接时
            {
                adr_sz = sizeof(clnt_adr);
                clnt_sock = accept(serv_sock, (struct sockaddr *)&amp;amp;clnt_adr, &amp;amp;adr_sz);
                event.events = EPOLLIN | EPOLLET;
                event.data.fd = clnt_sock; //把客户端套接字添加进去
                epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &amp;amp;event);
                printf(&quot;connected client : %d \n&quot;, clnt_sock);
            }
            else //是客户端套接字时
            {
                str_len = read(ep_events[i].data.fd, buf, BUF_SIZE);
                if (str_len == 0)
                {
                    epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL); //从epoll中删除套接字
                    close(ep_events[i].data.fd);
                    printf(&quot;closed client : %d \n&quot;, ep_events[i].data.fd);
                }
                else
                {
                    write(ep_events[i].data.fd, buf, str_len);
                }
            }
        }
    }
    close(serv_sock);
    close(epfd);

    return 0;
}

void error_handling(char *message)
{
    fputs(message, stderr);
    fputc(&#039;\n&#039;, stderr);
    exit(1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译运行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;gcc echo_EDGEserv.c -o serv
./serv 9190&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分别运行上面两个服务端代码来比较【条件触发】和【边缘触发】的区别。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;select 模型是以条件触发的方式工作的&lt;/strong&gt;。&lt;/p&gt;
&lt;h4&gt;边缘触发的服务器端必知的两点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;通过 errno 变量验证错误原因&lt;/li&gt;
&lt;li&gt;为了完成非阻塞（Non-blocking）I/O ，更改了套接字特性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linux 套接字相关函数一般通过 -1 通知发生了错误。虽然知道发生了错误，但仅凭这些内容无法得知产生错误的原因。因此，为了在发生错误的时候提额外的信息，Linux 声明了如下全局变量：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int errno;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了访问该变量，需要引入 &lt;code&gt;error.h&lt;/code&gt; 头文件，因此此头文件有上述变量的 extren 声明。另外，每种函数发生错误时，保存在 errno 变量中的值都不同。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;read 函数发现输入缓冲中没有数据可读时返回 -1，同时在 errno 中保存 EAGAIN 常量&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面是 Linux 中提供的改变和更改文件属性的办法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;fcntl.h&amp;gt;
int fcntl(int fields, int cmd, ...);
/*
成功时返回 cmd 参数相关值，失败时返回 -1
filedes : 属性更改目标的文件描述符
cmd : 表示函数调用目的
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从上述声明可以看出 fcntl 有可变参数的形式。如果向第二个参数传递 F_GETFL ，可以获得第一个参数所指的文件描述符属性（int 型）。反之，如果传递 F_SETFL ，可以更改文件描述符属性。若希望将文件（套接字）改为非阻塞模式，需要如下 2 条语句。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int flag = fcntl(fd,F_GETFL,0);
fcntl(fd,F_SETFL | O_NONBLOCK)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过第一条语句，获取之前设置的属性信息，通过第二条语句在此基础上添加非阻塞 O_NONBLOCK 标志。调用 read/write 函数时，无论是否存在数据，都会形成非阻塞文件（套接字）。fcntl 函数的适用范围很广。&lt;/p&gt;
&lt;h4&gt;实现边缘触发回声服务器端&lt;/h4&gt;
&lt;p&gt;通过 errno 确认错误的原因是：边缘触发方式中，接收数据仅注册一次该事件。&lt;/p&gt;
&lt;p&gt;因为这种特点，一旦发生输入相关事件时，就应该读取输入缓冲中的全部数据。因此需要验证输入缓冲是否为空。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;read 函数返回 -1，变量 errno 中的值变成 EAGAIN 时，说明没有数据可读。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;既然如此，为什么要将套接字变成非阻塞模式？边缘触发条件下，以阻塞方式工作的 read &amp;amp; write 函数有可能引起服务端的长时间停顿。因此，边缘触发方式中一定要采用非阻塞 read &amp;amp; write 函数。&lt;/p&gt;
&lt;p&gt;下面是以边缘触发方式工作的回声服务端代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;arpa/inet.h&amp;gt;
#include &amp;lt;sys/socket.h&amp;gt;
#include &amp;lt;sys/epoll.h&amp;gt;
#include &amp;lt;fcntl.h&amp;gt;
#include &amp;lt;errno.h&amp;gt;

#define BUF_SIZE 4 //缓冲区设置为 4 字节
#define EPOLL_SIZE 50
void setnonblockingmode(int fd);
void error_handling(char *message);

int main(int argc, char *argv[])
{
    int serv_sock, clnt_sock;
    struct sockaddr_in serv_adr, clnt_adr;
    socklen_t adr_sz;
    int str_len, i;
    char buf[BUF_SIZE];

    struct epoll_event *ep_events;
    struct epoll_event event;
    int epfd, event_cnt;

    if (argc != 2)
    {
        printf(&quot;Usage : %s &amp;lt;port&amp;gt; \n&quot;, argv[0]);
        exit(1);
    }
    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    memset(&amp;amp;serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(atoi(argv[1]));

    if (bind(serv_sock, (struct sockaddr *)&amp;amp;serv_adr, sizeof(serv_adr)) == -1)
        error_handling(&quot;bind() error&quot;);
    if (listen(serv_sock, 5) == -1)
        error_handling(&quot;listen() error&quot;);

    epfd = epoll_create(EPOLL_SIZE); //可以忽略这个参数，填入的参数为操作系统参考
    ep_events = malloc(sizeof(struct epoll_event) * EPOLL_SIZE);

    setnonblockingmode(serv_sock);
    event.events = EPOLLIN; //需要读取数据的情况
    event.data.fd = serv_sock;
    epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &amp;amp;event); //例程epfd 中添加文件描述符 serv_sock，目的是监听 enevt 中的事件

    while (1)
    {
        event_cnt = epoll_wait(epfd, ep_events, EPOLL_SIZE, -1); //获取改变了的文件描述符，返回数量
        if (event_cnt == -1)
        {
            puts(&quot;epoll_wait() error&quot;);
            break;
        }

        puts(&quot;return epoll_wait&quot;);
        for (i = 0; i &amp;lt; event_cnt; i++)
        {
            if (ep_events[i].data.fd == serv_sock) //客户端请求连接时
            {
                adr_sz = sizeof(clnt_adr);
                clnt_sock = accept(serv_sock, (struct sockaddr *)&amp;amp;clnt_adr, &amp;amp;adr_sz);
                setnonblockingmode(clnt_sock);    //将 accept 创建的套接字改为非阻塞模式
                event.events = EPOLLIN | EPOLLET; //改成边缘触发
                event.data.fd = clnt_sock;        //把客户端套接字添加进去
                epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &amp;amp;event);
                printf(&quot;connected client : %d \n&quot;, clnt_sock);
            }
            else //是客户端套接字时
            {
                while (1)
                {
                    str_len = read(ep_events[i].data.fd, buf, BUF_SIZE);
                    if (str_len == 0)
                    {
                        epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL); //从epoll中删除套接字
                        close(ep_events[i].data.fd);
                        printf(&quot;closed client : %d \n&quot;, ep_events[i].data.fd);
                        break;
                    }
                    else if (str_len &amp;lt; 0)
                    {
                        if (errno == EAGAIN) //read 返回-1 且 errno 值为 EAGAIN ，意味读取了输入缓冲的全部数据
                            break;
                    }
                    else
                    {
                        write(ep_events[i].data.fd, buf, str_len);
                    }
                }
            }
        }
    }
    close(serv_sock);
    close(epfd);

    return 0;
}

void error_handling(char *message)
{
    fputs(message, stderr);
    fputc(&#039;\n&#039;, stderr);
    exit(1);
}
void setnonblockingmode(int fd)
{
    int flag = fcntl(fd, F_GETFL, 0);
    fcntl(fd, F_SETFL, flag | O_NONBLOCK);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译运行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;gcc echo_EPETserv.c -o serv
./serv&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;条件触发和边缘触发孰优孰劣&lt;/h4&gt;
&lt;p&gt;边缘触发方式可以做到这点：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;可以分离接收数据和处理数据的时间点！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面是边缘触发的图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/109cfde8-0df0-4109-823d-f3403934747d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;运行流程如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务器端分别从 A B C 接收数据&lt;/li&gt;
&lt;li&gt;服务器端按照 A B C 的顺序重新组合接收到的数据&lt;/li&gt;
&lt;li&gt;组合的数据将发送给任意主机。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了完成这个过程，如果可以按照如下流程运行，服务端的实现并不难：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;客户端按照 A B C 的顺序连接服务器，并且按照次序向服务器发送数据&lt;/li&gt;
&lt;li&gt;需要接收数据的客户端应在客户端 A B C 之前连接到服务器端并等待&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但是实际情况中可能是下面这样：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;客户端 C 和 B 正在向服务器发送数据，但是 A 并没有连接到服务器&lt;/li&gt;
&lt;li&gt;客户端 A B C 乱序发送数据&lt;/li&gt;
&lt;li&gt;服务端已经接收到数据，但是要接收数据的目标客户端并没有连接到服务器端。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，即使输入缓冲收到数据，服务器端也能决定读取和处理这些数据的时间点，这样就给服务器端的实现带来很大灵活性。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;文本参考：&lt;/p&gt;
&lt;p&gt;《TCP/IP网络编程》&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/riba2534/TCP-IP-NetworkNote&quot;&gt;GitHub - riba2534/TCP-IP-NetworkNote: 📘《TCP/IP网络编程》(韩-尹圣雨)学习笔记&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BC%98%E4%BA%8Eselect%E7%9A%84epoll.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BC%98%E4%BA%8Eselect%E7%9A%84epoll.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>I/O复用</title>
            <description>
            &lt;!--
author: admin
date: 2022-03-30
title: I/O复用
tags: 网络编程
category: C
status: publish
summary: 多进程和I/O复用的比较
--&gt;
&lt;h1&gt;I/O复用&lt;/h1&gt;
&lt;h3&gt;基于 I/O 复用的服务器端&lt;/h3&gt;
&lt;h4&gt;多进程服务端的缺点和解决方法&lt;/h4&gt;
&lt;p&gt;为了构建并发服务器，只要有客户端连接请求就会创建新进程。这的确是实际操作中采用的一种方案，但并非十全十美，因为创建进程要付出很大的代价。这需要大量的运算和内存空间，由于每个进程都具有独立的内存空间，所以相互间的数据交换也要采用相对复杂的方法（IPC 属于相对复杂的通信方法）&lt;/p&gt;
&lt;p&gt;I/O 复用技术可以解决这个问题。&lt;/p&gt;
&lt;h4&gt;理解复用(Multiplexing)&lt;/h4&gt;
&lt;p&gt;「复用」在电子及通信工程领域很常见，向这些领域的专家询问其概念，可能会得到如下答复：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在 1 个通信频道中传递多个数据（信号）的技术&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「复用」的含义：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;为了提高物理设备的效率，只用最少的物理要素传递最多数据时使用的技术&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上述两种方法的内容完全一致。可以用纸电话模型做一个类比：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/db172ae1-84ec-4fd7-84cb-1bdfcd5a7a31.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上图是一个纸杯电话系统，为了使得三人同时通话，说话时要同事对着两个纸杯，接听时也需要耳朵同时对准两个纸杯。为了完成 3 人通话，可以进行如下图的改进：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/84524477-746a-450e-9f00-790b0bae3587.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如图做出改进，就是引入了复用技术。&lt;/p&gt;
&lt;p&gt;复用技术的优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;减少连线长度&lt;/li&gt;
&lt;li&gt;减少纸杯个数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;即使减少了连线和纸杯的量仍然可以进行三人同时说话，但是如果碰到以下情况：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「好像不能同时说话？」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;实际上，因为是在进行对话，所以很少发生同时说话的情况。也就是说，上述系统采用的是「时分复用」技术。因为说话人声频率不同，即使在同时说话也能进行一定程度上的区分（杂音也随之增多）。因此，也可以说是「频分复用技术」。&lt;/p&gt;
&lt;h4&gt;复用技术在服务器端的应用&lt;/h4&gt;
&lt;p&gt;纸杯电话系统引入复用技术之后可以减少纸杯数量和连线长度。服务器端引入复用技术可以减少所需进程数。下图是多进程服务端的模型：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/9d5fd2c2-51f6-4528-9d0f-2e02ecacb832.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下图是引入复用技术之后的模型：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/330ed870-f914-4b32-8188-b31b62eb5455.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从图上可以看出，引入复用技术之后，可以减少进程数。重要的是，无论连接多少客户端，提供服务的进程只有一个。&lt;/p&gt;
&lt;h3&gt;理解 select 函数并实现服务端&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;select&lt;/code&gt; 函数是最具代表性的实现复用服务器的方法。在 Windows 平台下也有同名函数，所以具有很好的移植性。&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;select&lt;/code&gt; 函数的功能和调用顺序&lt;/h4&gt;
&lt;p&gt;使用 &lt;code&gt;select&lt;/code&gt; 函数时可以将多个文件描述符集中到一起统一监视，项目如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否存在套接字接收数据？&lt;/li&gt;
&lt;li&gt;无需阻塞传输数据的套接字有哪些？&lt;/li&gt;
&lt;li&gt;哪些套接字发生了异常？&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;术语：「事件」。当发生监视项对应情况时，称「发生了事件」。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;select 函数的使用方法与一般函数的区别并不大，更准确的说，他很难使用。但是为了实现 I/O 复用服务器端，我们应该掌握 select 函数，并运用于套接字编程当中。认为「select 函数是 I/O 复用的全部内容」也并不为过。select 函数的调用过程如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/a28520ba-dedb-4a7e-8784-7b3fecaf628c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;设置文件描述符&lt;/h4&gt;
&lt;p&gt;利用 select 函数可以同时监视多个文件描述符。当然，监视文件描述符可以视为监视套接字。此时首先需要将要监视的文件描述符集中在一起。集中时也要按照监视项（接收、传输、异常）进行区分，即按照上述 3 种监视项分成 3 类。&lt;/p&gt;
&lt;p&gt;利用 fd_set 数组变量执行此操作，如图所示，该数组是存有0和1的位数组。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/281c1daf-b782-4712-b174-77a796a4b80c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图中最左端的位表示文件描述符 0（所在位置）。如果该位设置为 1，则表示该文件描述符是监视对象。那么图中哪些文件描述符是监视对象呢？很明显，是描述符 1 和 3。&lt;/p&gt;
&lt;p&gt;在 fd_set 变量中注册或更改值的操作都由下列宏完成。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FD_ZERO(fd_set *fdset)&lt;/code&gt;：将 fd_set 变量所指的位全部初始化成0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FD_SET(int fd,fd_set *fdset)&lt;/code&gt;：在参数 fdset 指向的变量中注册文件描述符 fd 的信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FD_SLR(int fd,fd_set *fdset)&lt;/code&gt;：从参数 fdset 指向的变量中清除文件描述符 fd 的信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FD_ISSET(int fd,fd_set *fdset)&lt;/code&gt;：若参数 fdset 指向的变量中包含文件描述符 fd 的信息，则返回「真」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上述函数中，FD_ISSET 用于验证 select 函数的调用结果，通过下图解释这些函数的功能：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e087beca-21f4-4e59-87a3-6cf134e85a28.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;设置检查（监视）范围及超时&lt;/h4&gt;
&lt;p&gt;下面是 select 函数的定义：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;sys/select.h&amp;gt;
#include &amp;lt;sys/time.h&amp;gt;

int select(int maxfd, fd_set *readset, fd_set *writeset,
           fd_set *exceptset, const struct timeval *timeout);
/*
成功时返回大于 0 的值，失败时返回 -1
maxfd: 监视对象文件描述符数量
readset: 将所有关注「是否存在待读取数据」的文件描述符注册到 fd_set 型变量，并传递其地址值。
writeset: 将所有关注「是否可传输无阻塞数据」的文件描述符注册到 fd_set 型变量，并传递其地址值。
exceptset: 将所有关注「是否发生异常」的文件描述符注册到 fd_set 型变量，并传递其地址值。
timeout: 调用 select 函数后，为防止陷入无限阻塞的状态，传递超时(time-out)信息
返回值: 发生错误时返回 -1,超时时返回0,。因发生关注的时间返回时，返回大于0的值，该值是发生事件的文件描述符数。
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如上所述，select 函数用来验证 3 种监视的变化情况，根据监视项声明 3 个 fd_set 型变量，分别向其注册文件描述符信息，并把变量的地址值传递到上述函数的第二到第四个参数。但在此之前（调用 select 函数之前）需要决定下面两件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;文件描述符的监视（检查）范围是？&lt;/li&gt;
&lt;li&gt;如何设定 select 函数的超时时间？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一，文件描述符的监视范围和 select 的第一个参数有关。实际上，select 函数要求通过第一个参数传递监视对象文件描述符的数量。因此，需要得到注册在 fd_set 变量中的文件描述符数。但每次新建文件描述符时，其值就会增加 1 ，故只需将最大的文件描述符值加 1 再传递给 select 函数即可。加 1 是因为文件描述符的值是从 0 开始的。&lt;/p&gt;
&lt;p&gt;第二，select 函数的超时时间与 select 函数的最后一个参数有关，其中 timeval 结构体定义如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;struct timeval
{
    long tv_sec;
    long tv_usec;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本来 select 函数只有在监视文件描述符发生变化时才返回。如果未发生变化，就会进入阻塞状态。指定超时时间就是为了防止这种情况的发生。通过上述结构体变量，将秒数填入 tv_sec 的成员，将微妙数填入 tv_usec 的成员，然后将结构体的地址值传递到 select 函数的最后一个参数。此时，即使文件描述符未发生变化，只要过了指定时间，也可以从函数中返回。不过这种情况下， select 函数返回 0 。因此，可以通过返回值了解原因。如果不向设置超时，则传递 NULL 参数。&lt;/p&gt;
&lt;h4&gt;调用 select 函数查看结果&lt;/h4&gt;
&lt;p&gt;select 返回正整数时，怎样获知哪些文件描述符发生了变化？向 select 函数的第二到第四个参数传递的 fd_set 变量中将产生如图所示的变化：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/948bc7fa-88cd-44ef-8903-3be66705cd46.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;由图可知，select 函数调用完成候，向其传递的 fd_set 变量将发生变化。原来为 1 的所有位将变成 0，但是发生了变化的文件描述符除外。因此，可以认为值仍为 1 的位置上的文件描述符发生了变化。&lt;/p&gt;
&lt;h4&gt;实现 I/O 复用服务器端&lt;/h4&gt;
&lt;p&gt;下面通过 select 函数实现 I/O 复用服务器端。下面是基于 I/O 复用的回声服务器端。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;arpa/inet.h&amp;gt;
#include &amp;lt;sys/socket.h&amp;gt;
#include &amp;lt;sys/time.h&amp;gt;
#include &amp;lt;sys/select.h&amp;gt;

#define BUF_SIZE 100
void error_handling(char *message);

int main(int argc, char *argv[])
{
    int serv_sock, clnt_sock;
    struct sockaddr_in serv_adr, clnt_adr;
    struct timeval timeout;
    fd_set reads, cpy_reads;

    socklen_t adr_sz;
    int fd_max, str_len, fd_num, i;
    char buf[BUF_SIZE];
    if (argc != 2)
    {
        printf(&quot;Usage : %s &amp;lt;port&amp;gt;\n&quot;, argv[0]);
        exit(1);
    }
    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    memset(&amp;amp;serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(atoi(argv[1]));

    if (bind(serv_sock, (struct sockaddr *)&amp;amp;serv_adr, sizeof(serv_adr)) == -1)
        error_handling(&quot;bind() error&quot;);
    if (listen(serv_sock, 5) == -1)
        error_handling(&quot;listen() error&quot;);

    FD_ZERO(&amp;amp;reads);
    FD_SET(serv_sock, &amp;amp;reads); //注册服务端套接字
    fd_max = serv_sock;

    while (1)
    {
        cpy_reads = reads;
        timeout.tv_sec = 5;
        timeout.tv_usec = 5000;

        if ((fd_num = select(fd_max + 1, &amp;amp;cpy_reads, 0, 0, &amp;amp;timeout)) == -1) //开始监视,每次重新监听
            break;
        if (fd_num == 0)
            continue;

        for (i = 0; i &amp;lt; fd_max + 1; i++)
        {
            if (FD_ISSET(i, &amp;amp;cpy_reads)) //查找发生变化的套接字文件描述符
            {
                if (i == serv_sock) //如果是服务端套接字时,受理连接请求
                {
                    adr_sz = sizeof(clnt_adr);
                    clnt_sock = accept(serv_sock, (struct sockaddr *)&amp;amp;clnt_adr, &amp;amp;adr_sz);

                    FD_SET(clnt_sock, &amp;amp;reads); //注册一个clnt_sock
                    if (fd_max &amp;lt; clnt_sock)
                        fd_max = clnt_sock;
                    printf(&quot;Connected client: %d \n&quot;, clnt_sock);
                }
                else //不是服务端套接字时
                {
                    str_len = read(i, buf, BUF_SIZE); //i指的是当前发起请求的客户端
                    if (str_len == 0)
                    {
                        FD_CLR(i, &amp;amp;reads);
                        close(i);
                        printf(&quot;closed client: %d \n&quot;, i);
                    }
                    else
                    {
                        write(i, buf, str_len);
                    }
                }
            }
        }
    }
    close(serv_sock);
    return 0;
}

void error_handling(char *message)
{
    fputs(message, stderr);
    fputc(&#039;\n&#039;, stderr);
    exit(1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译运行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;gcc echo_selectserv.c -o selserv
./selserv 9190&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;文本参考：&lt;/p&gt;
&lt;p&gt;《TCP/IP网络编程》&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/riba2534/TCP-IP-NetworkNote&quot;&gt;GitHub - riba2534/TCP-IP-NetworkNote: 📘《TCP/IP网络编程》(韩-尹圣雨)学习笔记&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/IO%E5%A4%8D%E7%94%A8.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/IO%E5%A4%8D%E7%94%A8.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>C语言中exit和return的区别</title>
            <description>
            &lt;!--
author: admin
date: 2022-03-28
title: C语言中exit和return的区别
tags: 编程
category: C
status: publish
summary: 真的需要学而时习之
--&gt;
&lt;h1&gt;C语言中exit和return的区别&lt;/h1&gt;
&lt;p&gt;今天在看《TCP/IP网络编程》的第10章“基于多任务的并发服务器”时发现，作者在子进程中使用了&lt;code&gt;return 0&lt;/code&gt;来结束，而我之前在网上找的&lt;code&gt;tcp socket&lt;/code&gt;示例则是使用了&lt;code&gt;exit(0)&lt;/code&gt;来结束。那么&lt;code&gt;return&lt;/code&gt;和&lt;code&gt;exit&lt;/code&gt;有什么区别吗？&lt;/p&gt;
&lt;p&gt;在 &lt;a href=&quot;https://stackoverflow.com/questions/3463551/what-is-the-difference-between-exit-and-return&quot;&gt;https://stackoverflow.com/questions/3463551/what-is-the-difference-between-exit-and-return&lt;/a&gt; 找到了几个我觉得看得懂的解释&lt;/p&gt;
&lt;p&gt;Example with &lt;code&gt;return&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

void f(){
    printf(&quot;Executing f\n&quot;);
    return;
}

int main(){
    f();
    printf(&quot;Back from f\n&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you execute this program it prints:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Executing f&lt;/p&gt;
&lt;p&gt;Back from f&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Another example for &lt;code&gt;exit()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

void f(){
    printf(&quot;Executing f\n&quot;);
    exit(0);
}

int main(){
    f();
    printf(&quot;Back from f\n&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you execute this program it prints:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Executing f&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I wrote two programs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int main(){return 0;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdlib.h&amp;gt;
int main(){exit(0)}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After executing &lt;code&gt;gcc -S -O1&lt;/code&gt;. Here what I found watching at assembly (only important parts):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;main:
    movl    $0, %eax    /* setting return value */
    ret                 /* return from main */&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;main:
    subq    $8, %rsp    /* reserving some space */
    movl    $0, %edi    /* setting return value */
    call    exit        /* calling exit function */
                        /* magic and machine specific wizardry after this call */&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So my conclusion is: use &lt;code&gt;return&lt;/code&gt; when you can, and &lt;code&gt;exit()&lt;/code&gt; when you need.&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/C%E8%AF%AD%E8%A8%80%E4%B8%ADexit%E5%92%8Creturn%E7%9A%84%E5%8C%BA%E5%88%AB.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/C%E8%AF%AD%E8%A8%80%E4%B8%ADexit%E5%92%8Creturn%E7%9A%84%E5%8C%BA%E5%88%AB.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>单链表的反转（一）</title>
            <description>
            &lt;!--
author: admin
date: 2022-03-11
title: 单链表的反转（一）
tags: 数据结构
category: C
status: publish
summary: 数据结构之单链表的迭代法反转
--&gt;
&lt;h1&gt;单链表的反转(1)&lt;/h1&gt;
&lt;p&gt;通过前面章节的学习，读者已经对单链表以及它的用法有了一个完整的了解。在此基础上，本节再带领大家研究一个和单链表有关的问题，即如何实现单链表的反转。&lt;/p&gt;
&lt;p&gt;反转链表，又可以称为翻转或逆置链表，它们表达的是同一个意思。以图 1 所示的链表为例：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/094d47f0-22f7-42fd-a41f-027a23aa36a0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;经过反转（翻转、逆置）后，得到的新链表如图 2 所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/e1303eb0-b1a7-4d14-971c-5c6e611e11e0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;通过对比图 1 和 图 2 中的链表不难得知，所谓反转链表，就是将链表整体“反过来”，将头变成尾、尾变成头。那么，如何实现链表的反转呢？&lt;/p&gt;
&lt;p&gt;常用的实现方案有 4 种，这里分别将它们称为迭代反转法、递归反转法、就地逆置法和头插法。值得一提的是，&lt;strong&gt;递归反转法更适用于反转不带头节点的链表&lt;/strong&gt;；其它 3 种方法既能反转不带头节点的链表，也能反转带头节点的链表。&lt;/p&gt;
&lt;h4&gt;迭代反转链表&lt;/h4&gt;
&lt;p&gt;该算法的实现思想非常直接，就是从当前链表的头节点开始，一直遍历至链表的最后一个节点，这期间会逐个改变所遍历到的节点的指针域，令其指向前一个节点。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/598b6053-6e8e-4b3a-a0c9-4e8c2eaae813.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里使用的是有头节点的链表，创建三个指针：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;link* temp, * front, * back; // front表示temp节点之前的指针，back表示temp节点之后的指针
front = back = NULL; // 初始化指针
temp = l;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首先将&lt;code&gt;*temp&lt;/code&gt;指针指向头节点&lt;code&gt;*l&lt;/code&gt;，判断是否有&lt;code&gt;temp-&amp;gt;next&lt;/code&gt;，然后&lt;code&gt;temp=temp-&amp;gt;next&lt;/code&gt;，将&lt;code&gt;temp&lt;/code&gt;指针向后移动&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;if (temp-&amp;gt;next)
{
    temp = temp-&amp;gt;next;        
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;index_files/a48df36a-acd5-4f67-8868-56c4597dbe81.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当&lt;code&gt;*temp&lt;/code&gt;指向首元节点之后，就可以开始&lt;code&gt;while&lt;/code&gt;循环了：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;while (temp-&amp;gt;next) // 如果temp还存在下个节点
{
    back = temp-&amp;gt;next; // 将back节点向后移动
    temp-&amp;gt;next = front; // 将temp节点的next重新链接为它之前的节点
    front = temp; // 将front节点向后移动
    temp = back; // 将temp节点(也就是当前节点)向后移动
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过&lt;code&gt;back, temp, front&lt;/code&gt;三个指针的向后移动，达到向后迭代的效果。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/f2750642-7947-47ad-b490-b4fde57260a0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/7e35c81b-4d2f-47c5-9dbd-25b8c0c84121.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当&lt;code&gt;temp-&amp;gt;next&lt;/code&gt;为空时停止循环：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/2cf06616-9a1c-4a6b-8e79-2812d2a91e9f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;temp-&amp;gt;next = front; // 将最后一个节点的next指针指向前一个节点&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将头节点的指针指向最后一个节点，就是&lt;code&gt;temp&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/de33e6bc-2801-40be-9421-45cb6c8bc0f6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意，最开始的节点在front = NULL时就已经指向front了，上面几张图因为那时头节点还是指向它，所以没表示出来。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;l-&amp;gt;next = temp;
return l; // 返回链表&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;完整代码&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 反转链表
link* invertLink(link* l) {
    link* temp, * front, * back;
    front = back = NULL;
    temp = l; // 将temp指针指向头结点
    if (temp-&amp;gt;next)
    {
        temp = temp-&amp;gt;next; // 将temp指向首元节点        
    }
    while (temp-&amp;gt;next) // 开始while循环，直到temp没有下个节点
    {
        back = temp-&amp;gt;next;
        temp-&amp;gt;next = front;
        front = temp;
        temp = back;        
    }
    temp-&amp;gt;next = front;
    l-&amp;gt;next = temp;
    return l;
}&lt;/code&gt;&lt;/pre&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%8D%95%E9%93%BE%E8%A1%A8%E7%9A%84%E5%8F%8D%E8%BD%AC1.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%8D%95%E9%93%BE%E8%A1%A8%E7%9A%84%E5%8F%8D%E8%BD%AC1.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>如何才能认清自己</title>
            <description>
            &lt;!--
author: admin
date: 2022-03-08
title: 如何才能认清自己
tags: 思考/人生
category: 转载
status: publish
summary: 时间会让你看清楚，这一切都不是结果，而是过程。成功是过程，失败也是过程，荣耀是过程，耻辱也是过程。只有现在，才是结果。
--&gt;
&lt;h1&gt;如何才能认清自己&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;你知道么，二十多岁最重要的一件事不是有目标，不是肯奋斗，不是去冒险，这些都不重要。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;创业家热情似火的创业，圣杰坚韧笃定的奋斗江山，学者专注勤奋的致学。。。&lt;br /&gt;
谁的眼中都有闪闪发亮的人物，越靠近，吸引力越大。&lt;br /&gt;
越靠近，内心的某种悸动就越被放大。  &lt;/p&gt;
&lt;p&gt;但这世界上有些东西，是不属于你的，你要承认。&lt;br /&gt;
不是你没能力，而是你不会真心付出热情。&lt;br /&gt;
这就好比，有一个男生很好，你就马上接近，另外一个不错，也去试试，到头来一无所获，头顶&lt;a href=&quot;https://www.zhihu.com/search?q=%E7%BB%BF%E8%8C%B6%E5%A9%8A&amp;amp;search_source=Entity&amp;amp;hybrid_search_source=Entity&amp;amp;hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A68842030%7D&quot;&gt;绿茶婊&lt;/a&gt;之美名。&lt;br /&gt;
&lt;strong&gt;不是你那一型，就别特么流哈喇子。&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;你要弄清楚的是，你到底是被什么吸引？&lt;br /&gt;
是别人瞩目的眼光，还是潇洒不羁的生活，亦或是那种击中你的魅力。&lt;br /&gt;
但是你要问，这件事，是你的那一型么？&lt;br /&gt;
也许不是。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;这是第一件事：去问，自己喜欢什么。&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;无数的长辈和名人，都在用各种方式告诉我们。&lt;/p&gt;
&lt;p&gt;做自己喜欢的，随着自己的内心@￥#……等等。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;别人有别人的山高海阔，你有你的春花冬雪。&lt;/strong&gt;&lt;br /&gt;
他说太阳真美，为万物生长之需，是众生的信仰；月亮昏暗冷清，甚至没有人愿意多看一眼。&lt;br /&gt;
你要告诉他，是啊，太阳真美（1）；但是月亮不耀眼，使人能够仰望天空，释放心性，得以安歇（2）。&lt;br /&gt;
此外，世间有了日月更替，万物才能长盛不衰（3）。&lt;br /&gt;
这三步：&lt;br /&gt;
&lt;strong&gt;第一步，叫认清现实；&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;第二步，叫认清自己；&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;第三步，叫与这个世界和解。&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;u&gt;你可能都不会认可自己。&lt;/u&gt;&lt;br /&gt;
&lt;u&gt;认可自己喜欢安逸，认可自己脾气很差，认可自己长得真丑，认可自己一辈子无法达成别人几年奋斗的结果。&lt;/u&gt;&lt;br /&gt;
&lt;strong&gt;所以你即便知道自己喜欢什么，因为不认可自己，也会产生迷茫，以及盲从。&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;这就是最开始谈到的内心的悸动，其实是一种空洞，如果不认可，他就会越来越大。你的注意力也只会放在空洞上，无法生出智慧，无法做出改变，无法进步。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;这是第二件事：去认可自己的缺点。&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们大多数人，从一出生都拿着一副一般般的牌，甚至是烂牌。抱怨是无用的，焦虑是无用的。如何去打好这副牌，以及在后续的摸排中以及变化中如何扩大优势，才是我们应该思考的。&lt;/p&gt;
&lt;p&gt;而认可自己的缺点，是要我们活在当下，是将专注力放在正确的地方，是原谅自己和放松身心，是抛却过去重新开始的契机。&lt;/p&gt;
&lt;p&gt;也是认清自己的钥匙，转败为胜的开始。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;有很多事，直到过了很久，才会明白。&lt;/strong&gt;&lt;br /&gt;
明白原来可以这样做，明白竟然只有一个细节没做好，明白我的胜利无足轻重。&lt;br /&gt;
明白这没什么大不了，明白这事都没必要做。  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;时间会让你看清楚，这一切都不是结果。&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;而是过程。&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;成功是过程，失败也是过程。&lt;br /&gt;
荣耀是过程，后悔也是过程。  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;只有现在，才是结果。&lt;/strong&gt;&lt;br /&gt;
名分，过去的故事，昨日的情绪和树梢上的月亮，音响里播放过的《&lt;a href=&quot;https://www.zhihu.com/search?q=%E4%B8%80%E7%94%9F%E6%89%80%E7%88%B1&amp;amp;search_source=Entity&amp;amp;hybrid_search_source=Entity&amp;amp;hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A68842030%7D&quot;&gt;一生所爱&lt;/a&gt;》，都化作虚无，在脑海里留下痕迹，然后消失不见了。&lt;br /&gt;
还有未来，你定好的计划，美国坚固的大厦，窗外的雨，你充满希望的年龄。  &lt;/p&gt;
&lt;p&gt;过去的事情留下了无数的因，铸就了现在的果。&lt;br /&gt;
而你现在可以牵动无数的因，铸就未来的现在。  &lt;/p&gt;
&lt;p&gt;这一切，重要么？&lt;br /&gt;
不重要，太多的因果了，你能看到多少，又有能力促成多少。&lt;br /&gt;
因果之上，还有因果。&lt;br /&gt;
&lt;strong&gt;世界之大，拥有无数的可能性。只有鼠目寸光，心胸狭窄的人才会拘泥于特定的选择和情绪，当下的状态与现实。&lt;/strong&gt;&lt;br /&gt;
我们奔走于现在，不断的为未来创造可能，并享受过去世界和自己带来的福祉。&lt;br /&gt;
这一切，也非常重要。&lt;br /&gt;
知道了这些，就清楚了为什么要不懈行动。&lt;br /&gt;
以及，什么时候不用不懈行动。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;这是第三件事：放下执念，活在当下。&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最难的事情莫过于此。&lt;/p&gt;
&lt;p&gt;长此以往，能养得胸中一团静气，不卑不亢。人不被执念控制住，便没了痛苦和亢奋，人更能理智而自信。专注力得以提升，做事便事半功倍。&lt;/p&gt;
&lt;p&gt;&lt;u&gt;放下你的执念，没有什么是必须达到的，没有什么能解释说明你，除了自由。&lt;/u&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;标签是进入驯化时代的最伟大产物。&lt;/strong&gt;&lt;br /&gt;
在语言没有形成之前，则是单纯的物质、武力奖惩，还有简单的几句“哦~哦~哦~”“吼~吼~吼~”。&lt;br /&gt;
举例：&lt;br /&gt;
（方式）夸奖、辱骂、讽刺、威胁、温柔、粗鲁、威严、庄重、轻声、低吼。。。。。&lt;br /&gt;
（常见）父母的夸奖、老师的教育、朋友的支持、敌人的辱骂。。。。&lt;br /&gt;
（用词）聪明、努力、忠诚、友善、精明、刻苦。。。。  &lt;/p&gt;
&lt;p&gt;再举个例子：&lt;br /&gt;
父母说你听话，老师说你刻苦，上司说你忠诚，敌人说你傻逼。。。&lt;br /&gt;
这些，其实就如同驯化的一种。  &lt;/p&gt;
&lt;p&gt;不同在于，父母老师可能是为我们好。&lt;br /&gt;
而上司、敌人、熟人却不一定。&lt;br /&gt;
但是，&lt;strong&gt;父母老师等权威的主张的也会片面。&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;延伸一下，对生活里的所有事情：&lt;br /&gt;
我们的思考，大神的建议，甚至这个世界都有可能片面（错的是整个世界！！！！囧）&lt;br /&gt;
&lt;strong&gt;那么如何去做出选择，如何在这么多建议中选择出最好的呢？&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;撕下理想的标签，再撕下欲望的标签。&lt;br /&gt;
大义、感情、仇恨、执念，甚至是嫉妒、痛苦都来源于一件事。&lt;br /&gt;
——&lt;a href=&quot;https://www.zhihu.com/search?q=%E5%B9%B8%E7%A6%8F%E6%84%9F&amp;amp;search_source=Entity&amp;amp;hybrid_search_source=Entity&amp;amp;hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A68842030%7D&quot;&gt;幸福感&lt;/a&gt;。  &lt;/p&gt;
&lt;p&gt;人们把自己玩儿进去了。&lt;br /&gt;
皆因幸福，而不幸，而产生&lt;a href=&quot;https://www.zhihu.com/search?q=%E4%B8%83%E6%83%85%E5%85%AD%E6%AC%B2&amp;amp;search_source=Entity&amp;amp;hybrid_search_source=Entity&amp;amp;hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A68842030%7D&quot;&gt;七情六欲&lt;/a&gt;来辅助。&lt;br /&gt;
所以，别扯淡了。&lt;br /&gt;
别说为了什么了，&lt;strong&gt;人各有所求，但皆因一事——幸福感。&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;就是这么一种感觉，来源于各色各样，在无数因果的世界里作为主线支配着这个世界。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;这是最重要的一件事：“爽”即是正义。&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不要骗自己，不要阻止自己。&lt;/p&gt;
&lt;p&gt;因为你阻止不了自己。&lt;/p&gt;
&lt;p&gt;作者：刘琛&lt;br /&gt;
链接：&lt;a href=&quot;https://www.zhihu.com/question/26683728/answer/68842030&quot;&gt;https://www.zhihu.com/question/26683728/answer/68842030&lt;/a&gt;&lt;br /&gt;
来源：知乎&lt;br /&gt;
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%A6%82%E4%BD%95%E6%89%8D%E8%83%BD%E8%AE%A4%E6%B8%85%E8%87%AA%E5%B7%B1.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%A6%82%E4%BD%95%E6%89%8D%E8%83%BD%E8%AE%A4%E6%B8%85%E8%87%AA%E5%B7%B1.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>单链表</title>
            <description>
            &lt;!--
author: admin
date: 2022-03-06
title: 单链表
tags: 数据结构
category: C
status: publish
summary: 数据结构之单链表
--&gt;
&lt;h1&gt;单链表&lt;/h1&gt;
&lt;p&gt;前面详细地介绍了&lt;a href=&quot;http://c.biancheng.net/view/3334.html&quot;&gt;顺序表&lt;/a&gt;，本节给大家介绍另外一种&lt;a href=&quot;http://c.biancheng.net/view/3333.html&quot;&gt;线性存储结构&lt;/a&gt;——链表。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;链表&lt;/strong&gt;，别名&lt;strong&gt;链式存储结构&lt;/strong&gt;或&lt;strong&gt;单链表&lt;/strong&gt;，用于存储逻辑关系为 &amp;quot;一对一&amp;quot; 的数据。&lt;strong&gt;与顺序表不同，链表不限制数据的物理存储状态，换句话说，使用链表存储的数据元素，其物理存储位置是随机的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例如，使用链表存储 &lt;code&gt;{1,2,3}&lt;/code&gt;，数据的物理存储状态如图 1 所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/2af7974b-49eb-48f7-9561-8b96b62ef353.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们看到，图 1 根本无法体现出各数据之间的逻辑关系。对此，链表的解决方案是，每个数据元素在存储时都配备一个指针，用于指向自己的直接后继元素。如图 2 所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/5d03e88d-47b1-4e44-89bc-5cbcb98006c0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;像图 2 这样，&lt;strong&gt;数据元素随机存储，并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;链表的节点&lt;/h3&gt;
&lt;p&gt;从图 2 可以看到，链表中每个数据的存储都由以下两部分组成：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据元素本身，其所在的区域称为&lt;strong&gt;数据域&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;指向直接后继元素的指针，所在的区域称为&lt;strong&gt;指针域&lt;/strong&gt;；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;即链表中存储各数据元素的结构如图 3 所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/d8f8f3c1-fd07-45bf-b5df-ca5bfd0feca4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图 3 所示的结构在链表中称为节点。也就是说，链表实际存储的是一个一个的节点，真正的数据元素包含在这些节点中，如图 4 所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/5fa55d68-850e-4116-9c9a-efd0908de7e8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因此，链表中每个节点的具体实现，需要使用 C 语言中的结构体，具体实现代码为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;typedef struct Link{
    int elem; // 代表数据域
    struct Link * next; // 代表指针域，指向直接后继元素
}link; // link为节点名，每个节点都是一个 link 结构体&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;提示，由于指针域中的指针要指向的也是一个节点，因此要声明为 Link 类型（这里要写成 &lt;code&gt;struct Link*&lt;/code&gt; 的形式）。&lt;/p&gt;
&lt;h3&gt;头节点，头指针和首元节点&lt;/h3&gt;
&lt;p&gt;其实，图 4 所示的链表结构并不完整。一个完整的链表需要由以下几部分构成：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;头指针&lt;/strong&gt;：一个普通的指针，它的特点是永远指向链表第一个节点的位置。很明显，头指针用于指明链表的位置，便于后期找到链表并使用表中的数据；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;节点&lt;/strong&gt;：链表中的节点又细分为&lt;strong&gt;头节点&lt;/strong&gt;、&lt;strong&gt;首元节点&lt;/strong&gt;和&lt;strong&gt;其他节点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;头节点&lt;/strong&gt;：其实就是一个不存任何数据的空节点，通常作为链表的第一个节点。对于链表来说，头节点不是必须的，它的作用只是为了方便解决某些实际问题；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;首元节点&lt;/strong&gt;：由于头节点（也就是空节点）的缘故，链表中称第一个存有数据的节点为首元节点。首元节点只是对链表中第一个存有数据节点的一个称谓，没有实际意义；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他节点&lt;/strong&gt;：链表中其他的节点；&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因此，一个存储 &lt;code&gt;{1,2,3}&lt;/code&gt; 的完整链表结构如图 5 所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/a7244660-5e80-45e1-849e-0db5bcaf7d07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;链表中有头节点时，头指针指向头节点；反之，若链表中没有头节点，则头指针指向首元节点。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;明白了链表的基本结构，下面我们来学习如何创建一个链表。&lt;/p&gt;
&lt;h3&gt;链表的初始化&lt;/h3&gt;
&lt;p&gt;创建一个链表需要做如下工作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;声明一个头指针（如果有必要，可以声明一个头节点）；&lt;/li&gt;
&lt;li&gt;创建多个存储数据的节点，在创建的过程中，要随时与其前驱节点建立逻辑关系；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如，创建一个存储 &lt;code&gt;{1,2,3,4}&lt;/code&gt; 且含头节点的链表，则 C 语言实现代码为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;link * initLink(){
    link * l=(link*)malloc(sizeof(link)); // 创建一个头结点
    link * temp=l;//声明一个指针指向头结点，
    //生成链表
    for (int i=1; i&amp;lt;5; i++) {
        link *new_node=(link*)malloc(sizeof(link));
        new_node-&amp;gt;elem=i;
        new_node-&amp;gt;next=NULL;
        temp-&amp;gt;next=new_node;
        temp=temp-&amp;gt;next; // 这两行等同于temp=new_node; 即temp指向下一个节点了
    }
    return l;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们只需在主函数中调用 initLink 函数，即可轻松创建一个存储 &lt;code&gt;{1,2,3,4}&lt;/code&gt; 的链表，C 语言完整代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

// 定义链表中节点的结构
typedef struct Link
{
    int elem;   // 代表数据域
    struct Link *next;  // 代表指针域
}link;  // link为节点名，每个节点都是一个link结构体

// 初始化链表的函数
link * initLink();
// 输出链表的函数
void displayLink(link *l);
// 销毁链表的函数
void destroyLink(link *l);

int main(void){
    // 初始化链表(1,2,3,4)
    printf(&quot;初始化链表为\n&quot;);
    link *l = initLink();
    // 打印链表
    displayLink(l);
    // 销毁链表
    destroyLink(l); 
    return 0;
}
// 初始化链表
link * initLink(){
    link * l=(link*)malloc(sizeof(link)); // 创建一个头结点
    link * temp=l; // 声明一个指针指向头结点，
    // 生成链表
    for (int i=1; i&amp;lt;5; i++) {
        link *new_node=(link*)malloc(sizeof(link));
        new_node-&amp;gt;elem=i;
        new_node-&amp;gt;next=NULL;
        temp-&amp;gt;next=new_node;
        temp=temp-&amp;gt;next;
    }
    return l;
}
// 输出链表
void displayLink(link *l){
    link* temp=l; // 将temp指针重新指向头结点
    // 只要temp指针指向的结点的next不是Null，就执行输出语句。
    while (temp-&amp;gt;next) {
        temp=temp-&amp;gt;next;
        printf(&quot;%d &quot;,temp-&amp;gt;elem);
    }
    printf(&quot;\n&quot;);
}
// 销毁链表
void destroyLink(link *l){
    link* temp=l; // 将temp指针重新指向头节点
    // 只要temp指针指向的结点的next不是Null，就执行输出语句
    while (temp-&amp;gt;next)
    {
        link *old_node = temp; // 创建一个旧节点来暂存当前的节点
        temp=temp-&amp;gt;next; // 将temp向右移动到下一个节点
        free(old_node); // 释放就节点的内存
    }
    free(temp); // 释放最新节点的内存
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;链表插入元素&lt;/h3&gt;
&lt;p&gt;同&lt;a href=&quot;http://c.biancheng.net/view/3334.html&quot;&gt;顺序表&lt;/a&gt;一样，向链表中增添元素，根据添加位置不同，可分为以下 3 种情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;插入到链表的头部（头节点之后），作为首元节点；&lt;/li&gt;
&lt;li&gt;插入到链表中间的某个位置；&lt;/li&gt;
&lt;li&gt;插入到链表的最末端，作为链表中最后一个数据元素；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;虽然新元素的插入位置不固定，但是链表插入元素的思想是固定的，只需做以下两步操作，即可将新元素插入到指定的位置：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将新结点的 next 指针指向插入位置后的结点；&lt;/li&gt;
&lt;li&gt;将插入位置前结点的 next 指针指向插入结点；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如，我们在链表 &lt;code&gt;{1,2,3,4}&lt;/code&gt; 的基础上分别实现在头部、中间部位、尾部插入新元素 5，其实现过程如图 1 所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/aef770c7-4df0-4511-8e0e-6d1c40b64074.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从图中可以看出，虽然新元素的插入位置不同，但实现插入操作的方法是一致的，都是先执行步骤 1 ，再执行步骤 2。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;链表插入元素的操作必须是先步骤 1，再步骤 2；反之，若先执行步骤 2，除非再添加一个指针，作为插入位置后续链表的头指针，否则会导致插入位置后的这部分链表丢失，无法再实现步骤 1。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;通过以上的讲解，我们可以尝试编写 C 语言代码来实现链表插入元素的操作：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// l为原链表，elem表示新数据元素，add表示新元素要插入的位置
link * insertElem(link * l, int elem, int add) {
    link * temp = l;//创建临时结点temp
    //首先找到要插入位置的上一个结点
    for (int i = 1; i &amp;lt; add; i++) {
        temp = temp-&amp;gt;next;
        if (temp == NULL) {
            printf(&quot;插入位置无效\n&quot;);
            return l;
        }
    }
    //创建插入结点c
    link * c = (link*)malloc(sizeof(link));
    c-&amp;gt;elem = elem;
    //向链表中插入结点
    c-&amp;gt;next = temp-&amp;gt;next;
    temp-&amp;gt;next = c;
    return l;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;链表删除元素&lt;/h3&gt;
&lt;p&gt;从链表中删除指定数据元素时，实则就是将存有该数据元素的节点从链表中摘除，但作为一名合格的程序员，要对存储空间负责，对不再利用的存储空间要及时释放。因此，从链表中删除数据元素需要进行以下 2 步操作：  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将结点从链表中摘下来;&lt;/li&gt;
&lt;li&gt;手动释放掉结点，回收被结点占用的存储空间;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其中，从链表上摘除某节点的实现非常简单，只需找到该节点的直接前驱节点 temp，执行一行程序：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;temp-&amp;gt;next=temp-&amp;gt;next-&amp;gt;next;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;例如，从存有 &lt;code&gt;{1,2,3,4}&lt;/code&gt; 的链表中删除元素 3，则此代码的执行效果如图 2 所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/18c92cd3-8d77-4f8b-9dac-922842f89cc6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因此，链表删除元素的 C 语言实现如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// l为原链表，add为要删除元素的值
link * delElem(link * l, int add) {
    link * temp = l;
    //遍历到被删除结点的上一个结点
    for (int i = 1; i &amp;lt; add; i++) {
        temp = temp-&amp;gt;next;
        if (temp-&amp;gt;next == NULL) {
            printf(&quot;没有该结点\n&quot;);
            return l;
        }
    }
    link * del = temp-&amp;gt;next;//单独设置一个指针指向被删除结点，以防丢失
    temp-&amp;gt;next = temp-&amp;gt;next-&amp;gt;next;//删除某个结点的方法就是更改前一个结点的指针域
    free(del);//手动释放该结点，防止内存泄漏
    return l;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以看到，从链表上摘下的节点 del 最终通过 free 函数进行了手动释放。&lt;/p&gt;
&lt;h3&gt;链表查找元素&lt;/h3&gt;
&lt;p&gt;在链表中查找指定数据元素，最常用的方法是：从表头依次遍历表中节点，用被查找元素与各节点数据域中存储的数据元素进行比对，直至比对成功或遍历至链表最末端的 &lt;code&gt;NULL&lt;/code&gt;（比对失败的标志）。&lt;/p&gt;
&lt;p&gt;因此，链表中查找特定数据元素的 C 语言实现代码为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// l为原链表，elem表示被查找元素、
int selectElem(link * l,int elem){
//新建一个指针t，初始化为头指针 l
    link * t=l;
    int i=1;
    //由于头节点的存在，因此while中的判断为t-&amp;gt;next
    while (t-&amp;gt;next) {
        t=t-&amp;gt;next;
        if (t-&amp;gt;elem==elem) {
            return i;
        }
        i++;
    }
    //程序执行至此处，表示查找失败
    return -1;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意，遍历有头节点的链表时，需避免头节点对测试数据的影响，因此在遍历链表时，建立使用上面代码中的遍历方法，直接越过头节点对链表进行有效遍历。&lt;/p&gt;
&lt;h3&gt;链表更新元素&lt;/h3&gt;
&lt;p&gt;更新链表中的元素，只需通过遍历找到存储此元素的节点，对节点中的数据域做更改操作即可。&lt;/p&gt;
&lt;p&gt;直接给出链表中更新数据元素的 C 语言实现代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 更新函数，其中，add 表示更改结点在链表中的位置，newElem 为新的数据域的值
link *amendElem(link * l,int add,int newElem){
    link * temp=l;
    temp=temp-&amp;gt;next;//在遍历之前，temp指向首元结点
    //遍历到待更新结点
    for (int i=1; i&amp;lt;add; i++) {
        temp=temp-&amp;gt;next;
    }
    temp-&amp;gt;elem=newElem;
    return l;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;以上内容详细介绍了对链表中数据元素做&amp;quot;增删查改&amp;quot;的实现过程及 C 语言代码，在此给出本节的完整可运行代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

// 定义链表中节点的结构
typedef struct Link
{
    int elem;   // 代表数据域
    struct Link *next;  // 代表指针域
}link;  // link为节点名，每个节点都是一个link结构体

// 初始化链表的函数
link * initLink();
//链表插入的函数，p是链表，elem是插入的结点的数据域，add是插入的位置
link * insertElem(link * l, int elem, int add);
//删除结点的函数，p代表操作链表，add代表删除节点的位置
link * delElem(link * l, int add);
//查找结点的函数，elem为目标结点的数据域的值
int selectElem(link * l, int elem);
//更新结点的函数，newElem为新的数据域的值
link *amendElem(link * l, int add, int newElem);
// 输出链表的函数
void displayLink(link *l);
// 销毁链表的函数
void destroyLink(link *l);

int main(void){
    // 初始化链表(1,2,3,4)
    printf(&quot;初始化链表为\n&quot;);
    link *l = initLink();
    // 打印链表
    displayLink(l);

    printf(&quot;在第4的位置插入元素5: \n&quot;);
    l = insertElem(l, 5, 4);
    displayLink(l);

    printf(&quot;删除元素3: \n&quot;);
    l = delElem(l, 3);
    displayLink(l);

    printf(&quot;查找元素2的位置为: \n&quot;);
    int address = selectElem(l, 2);
    if (address == -1) {
        printf(&quot;没有该元素&quot;);
    }
    else {
        printf(&quot;元素2的位置为: %d\n&quot;, address);
    }
    printf(&quot;更改第3的位置上的数据为7:\n&quot;);
    l = amendElem(l, 3, 7);
    displayLink(l);

    // 销毁链表
    destroyLink(l); 
    return 0;
}

// 初始化链表
link * initLink(){
    link * l=(link*)malloc(sizeof(link)); // 创建一个头结点
    link * temp=l; // 声明一个指针指向头结点，
    // 生成链表
    for (int i=1; i&amp;lt;5; i++) {
        link *new_node=(link*)malloc(sizeof(link));
        new_node-&amp;gt;elem=i;
        new_node-&amp;gt;next=NULL;
        temp-&amp;gt;next=new_node;
        temp=temp-&amp;gt;next;
    }
    return l;
}

// 链表插入元素
link * insertElem(link * l, int elem, int add) {
    link * temp = l;//创建临时结点temp
    //首先找到要插入位置的上一个结点
    for (int i = 1; i &amp;lt; add; i++) {
        temp = temp-&amp;gt;next;
        if (temp == NULL) {
            printf(&quot;插入位置无效\n&quot;);
            return l;
        }
    }
    //创建插入结点c
    link * c = (link*)malloc(sizeof(link));
    c-&amp;gt;elem = elem;
    //向链表中插入结点
    c-&amp;gt;next = temp-&amp;gt;next;
    temp-&amp;gt;next = c;
    return  l;
}

// 链表删除元素
link * delElem(link * l, int add) {
    link * temp = l;
    //遍历到被删除结点的上一个结点
    for (int i = 1; i &amp;lt; add; i++) {
        temp = temp-&amp;gt;next;
        if (temp-&amp;gt;next == NULL) {
            printf(&quot;没有该结点\n&quot;);
            return l;
        }
    }
    link * del = temp-&amp;gt;next;//单独设置一个指针指向被删除结点，以防丢失
    temp-&amp;gt;next = temp-&amp;gt;next-&amp;gt;next;//删除某个结点的方法就是更改前一个结点的指针域
    free(del);//手动释放该结点，防止内存泄漏
    return l;
}

// 链表查询元素
int selectElem(link * l, int elem) {
    link * t = l;
    int i = 1;
    while (t-&amp;gt;next) {
        t = t-&amp;gt;next;
        if (t-&amp;gt;elem == elem) {
            return i;
        }
        i++;
    }
    return -1;
}

// 链表更新元素
link *amendElem(link * l, int add, int newElem) {
    link * temp = l;
    temp = temp-&amp;gt;next;//tamp指向首元结点
    //temp指向被删除结点
    for (int i = 1; i &amp;lt; add; i++) {
        temp = temp-&amp;gt;next;
    }
    temp-&amp;gt;elem = newElem;
    return l;
}

// 输出链表
void displayLink(link *l){
    link* temp=l; // 将temp指针重新指向头结点
    // 只要temp指针指向的结点的next不是Null，就执行输出语句。
    while (temp-&amp;gt;next) {
        temp=temp-&amp;gt;next;
        printf(&quot;%d &quot;,temp-&amp;gt;elem);
    }
    printf(&quot;\n&quot;);
}

// 销毁链表
void destroyLink(link *l){
    link* temp=l; // 将temp指针重新指向头节点
    // 只要temp指针指向的结点的next不是Null，就执行输出语句
    while (temp-&amp;gt;next)
    {
        link *old_node = temp; // 创建一个旧节点来暂存当前的节点
        temp=temp-&amp;gt;next; // 将temp向右移动到下一个节点
        free(old_node); // 释放就节点的内存
    }
    free(temp); // 释放最新节点的内存
}&lt;/code&gt;&lt;/pre&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%8D%95%E9%93%BE%E8%A1%A8.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%8D%95%E9%93%BE%E8%A1%A8.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>链式队列及基本操作</title>
            <description>
            &lt;!--
author: admin
date: 2022-03-05
title: 链式队列及基本操作
tags: 数据结构
category: C
status: publish
summary: 数据结构系列之链式队列
--&gt;
&lt;h1&gt;链式队列及基本操作&lt;/h1&gt;
&lt;p&gt;链式&lt;a href=&quot;http://c.biancheng.net/view/3352.html&quot;&gt;队列&lt;/a&gt;，简称&amp;quot;链队列&amp;quot;，即使用&lt;a href=&quot;http://c.biancheng.net/view/3336.html&quot;&gt;链表&lt;/a&gt;实现的队列存储结构。&lt;/p&gt;
&lt;p&gt;链式队列的实现思想同顺序队列类似，只需创建两个指针（命名为 top 和 rear）分别指向链表中队列的队头元素和队尾元素，如图 1 所示:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/f1f1b369-6990-4f7d-844e-519ba958509c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;图 1 所示为链式队列的初始状态，此时队列中没有存储任何数据元素，因此 top 和 rear 指针都同时指向头节点。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在创建链式队列时，强烈建议初学者创建一个带有头节点的链表，这样实现链式队列会更简单。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;链式队列初始化&lt;/h4&gt;
&lt;p&gt;由此，我们可以编写出创建链式队列的 C 语言实现代码为:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 链表中的节点结构
typedef struct QNode{
    int data;
    struct QNode * next;
}QNode;
// 创建链式队列的函数
QNode * initQueue(){
    // 创建一个头节点
    QNode * queue=(QNode*)malloc(sizeof(QNode));
    // 对头节点进行初始化
    queue-&amp;gt;next=NULL;
    return queue;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;链式队列数据入队&lt;/h4&gt;
&lt;p&gt;链队队列中，当有新的数据元素入队，只需进行以下 3 步操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将该数据元素用节点包裹，例如新节点名称为 elem；&lt;/li&gt;
&lt;li&gt;与 rear 指针指向的节点建立逻辑关系，即执行 rear-&amp;gt;next=elem；&lt;/li&gt;
&lt;li&gt;最后移动 rear 指针指向该新节点，即 rear=elem；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由此，新节点就入队成功了。&lt;/p&gt;
&lt;p&gt;例如，在图 1 的基础上，我们依次将 &lt;code&gt;{1,2,3}&lt;/code&gt; 依次入队，各个数据元素入队的过程如图 2 所示:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/ba67007e-70fd-42c3-b2fa-41d0e74cb6b8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;数据元素入链式队列的 C 语言实现代码为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;QNode* enQueue(QNode * rear,int data){
    // 1、用节点包裹入队元素
    QNode * enElem=(QNode*)malloc(sizeof(QNode));
    enElem-&amp;gt;data=data;
    enElem-&amp;gt;next=NULL;
    // 2、新节点与rear节点建立逻辑关系
    rear-&amp;gt;next=enElem;
    // 3、rear指向新节点
    rear=enElem;
    // 返回新的rear，为后续新元素入队做准备
    return rear;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;链式队列数据出队&lt;/h4&gt;
&lt;p&gt;当链式队列中，有数据元素需要出队时，按照 &amp;quot;先进先出&amp;quot; 的原则，只需将存储该数据的节点以及它之前入队的元素节点按照原则依次出队即可。这里，我们先学习如何将队头元素出队。&lt;/p&gt;
&lt;p&gt;链式队列中队头元素出队，需要做以下 3 步操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过 top 指针直接找到队头节点，创建一个新指针 p 指向此即将出队的节点；&lt;/li&gt;
&lt;li&gt;将 p 节点（即要出队的队头节点）从链表中摘除；&lt;/li&gt;
&lt;li&gt;释放节点 p，回收其所占的内存空间；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如，在图 2b) 的基础上，我们将元素 1 和 2 出队，则操作过程如图 3 所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;index_files/2ffef485-646e-4121-bb0b-fb5f7121366b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;链式队列中队头元素出队的 C 语言实现代码为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void DeQueue(QNode * top,QNode * rear){
    if (top-&amp;gt;next==NULL) {
        printf(&quot;队列为空&quot;);
        return ;
    }

    QNode * p=top-&amp;gt;next;
    printf(&quot;%d&quot;,p-&amp;gt;data);
    top-&amp;gt;next=p-&amp;gt;next;
    if (rear==p) {
        rear=top;
    }
    free(p);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意，将队头元素做出队操作时，需提前判断队列中是否还有元素，如果没有，要提示用户无法做出队操作，保证程序的健壮性。&lt;/p&gt;
&lt;h4&gt;总结&lt;/h4&gt;
&lt;p&gt;通过学习链式队列最基本的数据入队和出队操作，我们可以就实际问题，对以上代码做适当的修改。  &lt;/p&gt;
&lt;p&gt;前面在学习顺序队列时，由于&lt;a href=&quot;http://c.biancheng.net/view/3334.html&quot;&gt;顺序表&lt;/a&gt;的局限性，我们在顺序队列中实现数据入队和出队的基础上，又对实现代码做了改进，令其能够充分利用数组中的空间。链式队列就不需要考虑空间利用的问题，因为链式队列本身就是实时申请空间。因此，这可以算作是链式队列相比顺序队列的一个优势。  &lt;/p&gt;
&lt;p&gt;这里给出链式队列入队和出队的完整 C 语言代码为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

// 定义链式队列
typedef struct QNode {
    int data;
    struct QNode* next;
}QNode;
// 初始化队列
QNode* initQueue() {
    // 创建一个头节点
    QNode* queue = (QNode*)malloc(sizeof(QNode));
    // 对头节点进行初始化
    queue-&amp;gt;next = NULL;
    return queue;
}
// 数据入队
QNode* enQueue(QNode* rear, int data) {
    QNode* enElem = (QNode*)malloc(sizeof(QNode));
    enElem-&amp;gt;data = data;
    enElem-&amp;gt;next = NULL;
    //使用尾插法向链队列中添加数据元素
    rear-&amp;gt;next = enElem;
    rear = enElem;
    return rear;
}
// 数据出队
QNode* DeQueue(QNode* top, QNode* rear) {
    if (top-&amp;gt;next == NULL) {
        printf(&quot;\n队列为空&quot;);
        return rear;
    }
    QNode* p = top-&amp;gt;next;
    printf(&quot;%d &quot;, p-&amp;gt;data);
    top-&amp;gt;next = p-&amp;gt;next;
    if (rear == p) {
        rear = top;
    }
    free(p);
    return rear;
}
// 销毁队列
void destroyQueue(QNode* queue, QNode* top, QNode* rear) {
    while (top-&amp;gt;next) {
        QNode* p = top-&amp;gt;next;
        top-&amp;gt;next = p-&amp;gt;next;
        if (rear == p) {
            rear = top;
        }
        free(p);
    }
    free(queue);
    printf(&quot;\n队列已销毁\n&quot;);
}

int main() {
    QNode* queue, * top, * rear;
    queue = top = rear = initQueue();//创建头结点
    //向链队列中添加结点，使用尾插法添加的同时，队尾指针需要指向链表的最后一个元素
    rear = enQueue(rear, 1);
    rear = enQueue(rear, 2);
    rear = enQueue(rear, 3);
    rear = enQueue(rear, 4);
    //入队完成，所有数据元素开始出队列
    rear = DeQueue(top, rear);
    rear = DeQueue(top, rear);
    rear = DeQueue(top, rear);
    rear = DeQueue(top, rear);
    rear = DeQueue(top, rear);
    destroyQueue(queue, top, rear);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E9%93%BE%E5%BC%8F%E9%98%9F%E5%88%97%E5%8F%8A%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E9%93%BE%E5%BC%8F%E9%98%9F%E5%88%97%E5%8F%8A%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>顺序表</title>
            <description>
            &lt;!--
author: admin
date: 2022-03-04
title: 顺序表
tags: 数据结构
category: C
status: publish
summary: 数据结构系列之顺序表
--&gt;
&lt;h1&gt;顺序表&lt;/h1&gt;
&lt;h3&gt;什么是顺序表&lt;/h3&gt;
&lt;p&gt;顺序表，全名顺序存储结构，是线性表的一种。顺序表对数据的物理存储结构也有要求。顺序表存储数据时，会提前申请一整块足够大小的物理空间，然后将数据依次存储起来，存储时做到数据元素之间不留一丝缝隙。&lt;/p&gt;
&lt;p&gt;例如，使用顺序表存储集合 &lt;code&gt;{1,2,3,4,5}&lt;/code&gt;，数据最终的存储状态如图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/1G204H44-0.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;由此我们可以得出，将“具有 &#039;一对一&#039; 逻辑关系的数据按照次序连续存储到一整块物理空间上”的存储结构就是顺序存储结构。  &lt;/p&gt;
&lt;p&gt;通过观察图中数据的存储状态，我们可以发现，顺序表存储数据同数组非常接近。其实，顺序表存储数据使用的就是数组。&lt;/p&gt;
&lt;h3&gt;顺序表的初始化&lt;/h3&gt;
&lt;p&gt;使用顺序表存储数据之前，除了要申请足够大小的物理空间之外，为了方便后期使用表中的数据，顺序表还需要实时记录以下 2 项数据：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;顺序表申请的存储容量；&lt;/li&gt;
&lt;li&gt;顺序表的长度，也就是表中存储数据元素的个数；&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;正常状态下，顺序表申请的存储容量要大于顺序表的长度。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;因此，我们需要自定义顺序表，C 语言实现代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;typedef struct Table{
    int * head;//声明了一个名为head的长度不确定的数组，也叫“动态数组”
    int length;//记录当前顺序表的长度
    int size;//记录顺序表分配的存储容量
}table;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意，head 是我们声明的一个未初始化的动态数组，不要只把它看做是普通的指针。&lt;/p&gt;
&lt;p&gt;接下来开始学习顺序表的初始化，也就是初步建立一个顺序表。建立顺序表需要做如下工作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;给 head 动态数据申请足够大小的物理空间；&lt;/li&gt;
&lt;li&gt;给 size 和 length 赋初值；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，C 语言实现代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#define Size 5 //对Size进行宏定义，表示顺序表申请空间的大小
table initTable(){
    table t;
    t.head=(int*)malloc(Size*sizeof(int));//构造一个空的顺序表，动态申请存储空间
    if (!t.head) //如果申请失败，作出提示并直接退出程序
    {
        printf(&quot;初始化失败&quot;);
        exit(0);
    }
    t.length=0;//空表的长度初始化为0
    t.size=Size;//空表的初始存储空间为Size
    return t;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们看到，整个顺序表初始化的过程被封装到了一个函数中，此函数返回值是一个已经初始化完成的顺序表。这样做的好处是增加了代码的可用性，也更加美观。与此同时，顺序表初始化过程中，要注意对物理空间的申请进行判断，对申请失败的情况进行处理，这里只进行了“输出提示信息和强制退出”的操作，可以根据你自己的需要对代码中的 if 语句进行改进。&lt;/p&gt;
&lt;p&gt;通过在主函数中调用 initTable 语句，就可以成功创建一个空的顺序表，与此同时我们还可以试着向顺序表中添加一些元素，C 语言实现代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#define Size 5      // 对Size进行宏定义，表示顺序表申请空间的大小

// 自定义顺序表
typedef struct Table{
    int * head;     // 声明了一个名为head的长度不确定的数组，也叫“动态数组”注意，head 是我们声明的一个未初始化的动态数组，不要只把它看做是普通的指针。
    int length;     // 记录当前顺序表的长度
    int size;       // 记录顺序表分配的存储容量
}table;

// 初始化顺序表
table initTable(){
    table t;
    t.head=(int*)malloc(Size*sizeof(int));  // 构造一个空的顺序表，动态申请存储空间

    // 如果申请失败，作出提示并直接退出程序
    if (!t.head)
    {
        printf(&quot;初始化失败&quot;);
        exit(0);
    }
    t.length=0;     // 空表的长度初始化为0
    t.size=Size;     // 空表的初始存储空间为Size
    return t;
}

// 销毁顺序表中申请的内存
void destroyTable(table *t){
    free(t-&amp;gt;head);
}

// 输出顺序表中元素的函数
void displayTable(table t){
    for (int i=0;i&amp;lt;t.length;i++) {
        printf(&quot;%d &quot;,t.head[i]);
    }
    printf(&quot;\n&quot;);
}

int main(void){
    table t=initTable();
    //向顺序表中添加元素
    for (int i=1; i&amp;lt;=Size; i++) {
        t.head[i-1]=i;
        t.length++;
    }
    printf(&quot;顺序表中存储的元素分别是：\n&quot;);
    displayTable(t);
    destroyTable(&amp;amp;t1);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;程序运行结果如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;顺序表中存储的元素分别是：&lt;br /&gt;
1 2 3 4 5&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可以看到，顺序表初始化成功。&lt;/p&gt;
&lt;h3&gt;顺序表的基本操作&lt;/h3&gt;
&lt;h4&gt;顺序表插入元素&lt;/h4&gt;
&lt;p&gt;向已有顺序表中插入数据元素，根据插入位置的不同，可分为以下 3 种情况：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;插入到顺序表的表头；&lt;/li&gt;
&lt;li&gt;在表的中间位置插入元素；&lt;/li&gt;
&lt;li&gt;尾随顺序表中已有元素，作为顺序表中的最后一个元素；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;虽然数据元素插入顺序表中的位置有所不同，但是都使用的是同一种方式去解决，即：通过遍历，找到数据元素要插入的位置，然后做如下两步工作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将要插入位置元素以及后续的元素整体向后移动一个位置；&lt;/li&gt;
&lt;li&gt;将元素放到腾出来的位置上；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如，在 &lt;code&gt;{1,2,3,4,5}&lt;/code&gt; 的第 3 个位置上插入元素 6，实现过程如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;遍历至顺序表存储第 3 个数据元素的位置：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/1G315M34-0.gif&quot; alt=&quot;找到目标元素位置&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将元素 3 以及后续元素 4 和 5 整体向后移动一个位置：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/1G3152E2-1.gif&quot; alt=&quot;将插入位置腾出&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将新元素 6 放入腾出的位置：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/1G3155263-2.gif&quot; alt=&quot;插入目标元素&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因此，顺序表插入数据元素的 C 语言实现代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;//插入函数，其中，elem为插入的元素，add为插入到顺序表的位置
table addTable(table t,int elem,int add)
{
    //判断插入本身是否存在问题（如果插入元素位置比整张表的长度+1还大（如果相等，是尾随的情况），或者插入的位置本身不存在，程序作为提示并自动退出）
    if (add&amp;gt;t.length+1||add&amp;lt;1) {
        printf(&quot;插入位置有问题\n&quot;);
        return t;
    }
    //做插入操作时，首先需要看顺序表是否有多余的存储空间提供给插入的元素，如果没有，需要申请
    if (t.length==t.size) {
        t.head=(int *)realloc(t.head, (t.size+1)*sizeof(int));
        if (!t.head) {
            printf(&quot;存储分配失败\n&quot;);
            return t;
        }
        t.size+=1;
    } 
    //插入操作，需要将从插入位置开始的后续元素，逐个后移
    for (int i=t.length-1; i&amp;gt;=add-1; i--) {
        t.head[i+1]=t.head[i];
    }
    //后移完成后，直接将所需插入元素，添加到顺序表的相应位置
    t.head[add-1]=elem;
    //由于添加了元素，所以长度+1
    t.length++;
    return t;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意，动态数组额外申请更多物理空间使用的是 realloc 函数。并且，在实现后续元素整体后移的过程，目标位置其实是有数据的，还是 3，只是下一步新插入元素时会把旧元素直接覆盖。&lt;/p&gt;
&lt;h4&gt;顺序表删除元素&lt;/h4&gt;
&lt;p&gt;从顺序表中删除指定元素，实现起来非常简单，只需找到目标元素，并将其后续所有元素整体前移 1 个位置即可。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;后续元素整体前移一个位置，会直接将目标元素删除，可间接实现删除元素的目的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;例如，从 &lt;code&gt;{1,2,3,4,5}&lt;/code&gt; 中删除元素 3 的过程如图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/1G31532D-3.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因此，顺序表删除元素的 C 语言实现代码为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;table delTable(table t,int add){
    if (add&amp;gt;t.length || add&amp;lt;1) {
        printf(&quot;被删除元素的位置有误\n&quot;);
        return t;
    }
    //删除操作
    for (int i=add; i&amp;lt;t.length; i++) {
        t.head[i-1]=t.head[i];
    }
    t.length--;
    return t;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;顺序表查找元素&lt;/h4&gt;
&lt;p&gt;顺序表中查找目标元素，可以使用多种查找算法实现，比如说&lt;a href=&quot;http://c.biancheng.net/view/3428.html&quot;&gt;二分查找算法&lt;/a&gt;、插值查找算法等。&lt;/p&gt;
&lt;p&gt;这里，我们选择&lt;a href=&quot;http://c.biancheng.net/view/3427.html&quot;&gt;顺序查找算法&lt;/a&gt;，具体实现代码为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;//查找函数，其中，elem表示要查找的数据元素的值
int selectTable(table t,int elem){
    for (int i=0; i&amp;lt;t.length; i++) {
        if (t.head[i]==elem) {
            return i+1;
        }
    }
    return -1;//如果查找失败，返回-1
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;顺序表更改元素&lt;/h4&gt;
&lt;p&gt;顺序表更改元素的实现过程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;找到目标元素；&lt;/li&gt;
&lt;li&gt;直接修改该元素的值；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;顺序表更改元素的 C 语言实现代码为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;//更改函数，其中，elem为要更改的元素，newElem为新的数据元素
table amendTable(table t,int elem,int newElem){
    int add=selectTable(t, elem);
    t.head[add-1]=newElem;//由于返回的是元素在顺序表中的位置，所以-1就是该元素在数组中的下标
    return t;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上是顺序表使用过程中最常用的基本操作，这里给出本节完整的实现代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#define Size 5      //对Size进行宏定义，表示顺序表申请空间的大小

// 自定义顺序表
typedef struct Table{
    int * head;     //声明了一个名为head的长度不确定的数组，也叫“动态数组”注意，head 是我们声明的一个未初始化的动态数组，不要只把它看做是普通的指针。
    int length;     // 记录当前顺序表的长度
    int size;           // 记录顺序表分配的存储容量
}table;

// 初始化顺序表
table initTable(){
    table t;
    t.head=(int*)malloc(Size*sizeof(int));      // 构造一个空的顺序表，动态申请存储空间

    // 如果申请失败，作出提示并直接退出程序
    if (!t.head)
    {
        printf(&quot;初始化失败&quot;);
        exit(0);
    }
    t.length=0;     // 空表的长度初始化为0
    t.size=Size;     // 空表的初始存储空间为Size
    return t;
}

// 销毁顺序表中申请的内存
void destroyTable(table *t){
    free(t-&amp;gt;head);
}

// 在顺序表中插入元素
table addTable(table t,int elem,int add)
{
    if (add&amp;gt;t.length+1||add&amp;lt;1) {
        printf(&quot;插入位置有问题\n&quot;);
        return t;
    }
    if (t.length&amp;gt;=t.size) {
        t.head=(int *)realloc(t.head, (t.size+1)*sizeof(int));
        if (!t.head) {
            printf(&quot;存储分配失败\n&quot;);
        }
        t.size+=1;
    }
    for (int i=t.length-1; i&amp;gt;=add-1; i--) {
        t.head[i+1]=t.head[i];
    }
    t.head[add-1]=elem;
    t.length++;
    return t;
}

// 在顺序表中删除元素
table delTable(table t,int add){
    if (add&amp;gt;t.length || add&amp;lt;1) {
        printf(&quot;被删除元素的位置有误\n&quot;);
        return t;
    }
    for (int i=add; i&amp;lt;t.length; i++) {
        t.head[i-1]=t.head[i];
    }
    t.length--;
    return t;
}

// 在顺序表中搜索元素
int selectTable(table t,int elem){
    for (int i=0; i&amp;lt;t.length; i++) {
        if (t.head[i]==elem) {
            return i+1;
        }
    }
    return -1;
}

// 在顺序表中替换元素
table amendTable(table t,int elem,int newElem){
    int add=selectTable(t, elem);
    t.head[add-1]=newElem;
    return t;
}

//输出顺序表中元素的函数
void displayTable(table t){
    for (int i=0;i&amp;lt;t.length;i++) {
        printf(&quot;%d &quot;,t.head[i]);
    }
    printf(&quot;\n&quot;);
}
int main(){
    table t1=initTable();
    //向顺序表中添加元素
    for (int i=1; i&amp;lt;=Size; i++) {
        t1.head[i-1]=i;
        t1.length++;
    }

    printf(&quot;原顺序表: \n&quot;);
    displayTable(t1);

    printf(&quot;删除元素1:\n&quot;);
    t1=delTable(t1, 1);
    displayTable(t1);

    printf(&quot;在第2的位置插入元素5:\n&quot;);
    t1=addTable(t1, 5, 2);
    displayTable(t1);

    printf(&quot;查找元素3的位置:\n&quot;);
    int add=selectTable(t1, 3);
    printf(&quot;%d\n&quot;,add);

    printf(&quot;将元素3改为6:\n&quot;);
    t1=amendTable(t1, 3, 6);
    displayTable(t1);
    destroyTable(&amp;amp;t1);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;程序运行结果为：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;原顺序表：&lt;br /&gt;
1 2 3 4 5&lt;br /&gt;
删除元素1:&lt;br /&gt;
2 3 4 5&lt;br /&gt;
在第2的位置插入元素5:&lt;br /&gt;
2 5 3 4 5&lt;br /&gt;
查找元素3的位置:&lt;br /&gt;
3&lt;br /&gt;
将元素3改为6:&lt;br /&gt;
2 5 6 4 5&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://c.biancheng.net/view/3334.html&quot;&gt;顺序表（顺序存储结构）及初始化详解 (biancheng.net)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E9%A1%BA%E5%BA%8F%E8%A1%A8.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E9%A1%BA%E5%BA%8F%E8%A1%A8.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>数据结构</title>
            <description>
            &lt;!--
author: admin
date: 2022-03-04
title: 数据结构
tags: 数据结构
category: C
status: publish
summary: 数据结构系列之总览
--&gt;
&lt;h1&gt;数据结构&lt;/h1&gt;
&lt;h3&gt;什么是数据结构&lt;/h3&gt;
&lt;p&gt;数据结构，直白地理解，就是研究数据的存储方式。&lt;/p&gt;
&lt;p&gt;我们知道，数据存储只有一个目的，即为了方便后期对数据的再利用，就如同我们使用数组存储 &lt;code&gt;{1,2,3,4,5}&lt;/code&gt; 是为了后期取得它们的加和值，无缘由的数据存储行为是对存储空间的不负责任。&lt;/p&gt;
&lt;p&gt;因此，数据在计算机存储空间的存放，决不是胡乱的，这就要求我们选择一种好的方式来存储数据，而这也是数据结构的核心内容。&lt;/p&gt;
&lt;p&gt;例如，一直以来大家面对的数据存储，都是类似存储 1、2、{a,b,c}、&amp;quot;&lt;a href=&quot;http://data.biancheng.net&quot;&gt;http://data.biancheng.net&lt;/a&gt;&amp;quot; 这样的问题，解决方式无疑是用变量或者数组对数据进行存储，即：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int a=1;
int b=2;
char str[3]={&#039;a&#039;,&#039;b&#039;,&#039;c&#039;};
char *data=&quot;http://data.biancheng.net&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是，如果要存储这样一组数据：{张亮，张平，张华，张群，张晶，张磊}，数据之间具有这样的关系：张亮是张平、张华和张群的父亲，同时张平还是张晶和张磊的父亲，数据之间的关系如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/2-1Z426164500F8.gif&quot; alt=&quot;数据及数据之间的关系&quot; /&gt;&lt;/p&gt;
&lt;p&gt;对于存储之间具有复杂关系的数据，如果还是用变量或数组来存储（比如用数组存储 {“张亮”,&amp;quot;张平&amp;quot;,“张华”,&amp;quot;张群&amp;quot;,&amp;quot;张晶&amp;quot;,&amp;quot;张磊&amp;quot;} ），数据存储是没有问题，但是无法体现数据之间的逻辑关系，后期根本无法使用，显然不明智。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;针对此类数据，数据结构中提供有专门的树结构来存储这类数据。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;再比如，导航无疑是出游旅行的必备神器，在我们程序员眼中，无论是哪款导航软件，其导航功能的实现都需要大量地图数据的支持。很明显，这些数据绝不是使用变量或数组进行存储的，那样对于数据的使用简直是个悲剧。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;针对此类数据，数据结构提供了&lt;a href=&quot;http://c.biancheng.net/view/3404.html&quot;&gt;图存储结构&lt;/a&gt;，专门用于存储这类数据。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;通过以上两个示例可以体会出，数据结构教会我们的绝不仅仅是如何存储 1、2、{a,b,c} 这样简单的数据，而是解决具有复杂关系的大量数据的存储问题。&lt;/p&gt;
&lt;p&gt;因此，数据结构是什么? 我认为，&lt;strong&gt;数据结构是一门学科，它教会我们“如何存储具有复杂关系的数据更有助于后期对数据的再利用”&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;数据结构有哪些&lt;/h3&gt;
&lt;p&gt;数据结构大致包含以下几种存储结构：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;线性表，还可以细分为顺序表、链表、栈和队列；&lt;/li&gt;
&lt;li&gt;树结构，包括普通树、二叉树、线索二叉树等；&lt;/li&gt;
&lt;li&gt;图存储结构&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;线性表&lt;/h4&gt;
&lt;p&gt;线性表结构存储的数据往往是可以依次排列的，就像小朋友手拉手，每位学生的前面和后面都仅有一个小朋友和他拉手，具备这种“一对一”关系的数据就可以使用线性表来存储。&lt;/p&gt;
&lt;p&gt;例如，存储类似 {1,3,5,7,9} 这样的数据时，各元素依次排列，每个元素的前面和后边有且仅有一个元素与之相邻（除首元素和尾元素），因此可以使用线性表存储。&lt;/p&gt;
&lt;p&gt;线性表并不是一种具体的存储结构，它包含&lt;a href=&quot;http://c.biancheng.net/view/3334.html&quot;&gt;顺序存储结构&lt;/a&gt;和&lt;a href=&quot;http://c.biancheng.net/view/3336.html&quot;&gt;链式存储结构&lt;/a&gt;，是顺序表和链表的统称。&lt;/p&gt;
&lt;h5&gt;顺序表&lt;/h5&gt;
&lt;p&gt;顺序表，简单地理解，就是常用的数组，只是换了个名字而已，例如使用顺序表存储 {1,3,5,7,9}，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/2-1Z426164G5347.gif&quot; alt=&quot;顺序表结构&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;由于顺序表结构的底层实现借助的就是数组，因此对于初学者来说，可以把顺序表完全等价为数组，但实则不是这样。数据结构是研究数据存储方式的一门学科，它囊括的都是各种存储结构，而数组只是各种编程语言中的基本数据类型，并不属于数据结构的范畴。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5&gt;链表&lt;/h5&gt;
&lt;p&gt;我们知道，使用顺序表（底层实现靠数组）时，需要提前申请一定大小的存储空间，这块存储空间的物理地址是连续的。&lt;/p&gt;
&lt;p&gt;链表则完全不同，使用链表存储数据时，是随用随申请，因此数据的存储位置是相互分离的，换句话说，数据的存储位置是随机的。&lt;/p&gt;
&lt;p&gt;为了给各个数据块建立“依次排列”的关系，链表给各数据块增设一个指针，每个数据块的指针都指向下一个数据块（最后一个数据块的指针指向 NULL），就如同一个个小学生都伸手去拉住下一个小学生的手，这样，看似毫无关系的数据块就建立了“依次排列”的关系，也就形成了链表，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/2-1Z426164I1222.gif&quot; alt=&quot;链表结构&quot; /&gt;&lt;/p&gt;
&lt;h5&gt;栈和队列&lt;/h5&gt;
&lt;p&gt;栈和队列隶属于线性表，是特殊的线性表，因为它们对线性表中元素的进出做了明确的要求。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;栈中的元素只能从线性表的一端进出（另一端封死），且要遵循“先入后出”的原则，即先进栈的元素后出栈。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/2-1Z426164J5428.gif&quot; alt=&quot;栈结构示意图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;栈结构如上图所示，像一个木桶，栈中含有 3 个元素，分别是 A、B 和 C，从在栈中的状态可以看出 A 最先进的栈，然后 B 进栈，最后 C 进栈。根据“先进后出”的原则，3 个元素出栈的顺序应该是：C 最先出栈，然后 B 出栈，最后才是 A 出栈。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;队列中的元素只能从线性表的一端进，从另一端出，且要遵循“先入先出”的特点，即先进队列的元素也要先出队列。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/2-1Z426164K4453.gif&quot; alt=&quot;队列结构示意图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;队列结构如上图所示，队列中有 3 个元素，分别是 A、B 和 C，从在队列中的状态可以看出是 A 先进队列，然后 B 进，最后 C 进。根据“先进先出”的原则，3 个元素出队列的顺序应该是 A 最先出队列，然后 B 出，最后 C 出。&lt;/p&gt;
&lt;h4&gt;树存储结构&lt;/h4&gt;
&lt;p&gt;树存储结构适合存储具有“一对多”关系的数据。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/2-1Z426164P3416.gif&quot; alt=&quot;树存储结构示意图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，其中张平只有一个父亲，但他却有两（多）个孩子，这就是“一对多”的关系，满足这种关系的数据可以使用树存储结构。&lt;/p&gt;
&lt;h4&gt;图存储结构&lt;/h4&gt;
&lt;p&gt;图存储结构适合存储具有“多对多”关系的数据。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190426/2-1Z4261A50Q16.gif&quot; alt=&quot;图存储结构示意图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，从 V1 可以到达 V2、V3、V4，同样，从 V2、V3、V4 也可以到达 V1，这就是“多对多”的关系，满足这种关系的数据可以使用图存储结构。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>管道通信</title>
            <description>
            &lt;!--
author: admin
date: 2022-03-03
title: 管道通信
tags: unix,多进程
category: C
status: publish
summary: Unix系统中C语言多进程通信系列之管道通信
--&gt;
&lt;h1&gt;管道通信&lt;/h1&gt;
&lt;h3&gt;进程间通信&lt;/h3&gt;
&lt;p&gt;多进程编程，如果进程之间需要进行各种消息传递(message passing)，那么必然要通信，我们称之为IPC(Inter-process communication)。&lt;/p&gt;
&lt;p&gt;在Unix系统中，消息传递经历了如下几个发展阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;管道(pipe)&lt;/strong&gt; 是第一个广泛使用的IPC形式，既可在程序中使用，也可以从shell中使用。管道的问题在于它们只能在具有共同祖先(指父子进程关系)的进程间使用，不过该问题已随 &lt;strong&gt;有名管道(named pipe)&lt;/strong&gt; 即&lt;strong&gt;FIFO&lt;/strong&gt;的引入而解决了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System V 消息队列(System V message queue)&lt;/strong&gt; 是在20世纪80年代早期加到System V内核中的。它们可用在同一主机上有亲缘关系或无亲缘关系的进程之间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Posix 消息队列&lt;/strong&gt; 是由Posix实时标准加入的。它们可用在同一主机上有亲缘关系或无亲缘关系的进程之间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远程过程调用(Remote Procedure Call，简称RPC)&lt;/strong&gt; 出现在20世纪80年代中期，它是从一个系统(客户主机)上某个程序调用另一个系统(服务器主机)上某个函数的一种方法，是作为显式网络编程的一种替换方法开发。也算是另一种形式的消息传递。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文主要介绍第一种方式——管道。&lt;/p&gt;
&lt;h4&gt;架构&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;父进程
  |
  | ---- 子进程&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在父进程中创建一个子进程，子进程从26个英文字母中随机产生一个，并返回给父进程。&lt;/p&gt;
&lt;h4&gt;子进程中要执行的程序&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;random_letter.c&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;time.h&amp;gt;

int main(void)
{
    int a;
    const char * a_to_z = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;;
    srand((unsigned)time(NULL));
    a = rand() % 26;
    printf(&quot;%c\n&quot;,a_to_z[a]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用&lt;code&gt;rand()%26&lt;/code&gt;产生一个从0-25的随机数，然后通过这个随机数在&lt;code&gt;a_to_z&lt;/code&gt;字符串指针只获取当前位置的字符来达到随机字母的效果。&lt;/p&gt;
&lt;h4&gt;fork()&lt;/h4&gt;
&lt;p&gt;在Unix中，使用&lt;code&gt;fork()&lt;/code&gt;来克隆进程，&lt;code&gt;fork()&lt;/code&gt;被调用一次会返回两次，在子进程中会返回0，在父进程中返回子进程的进程标识符，可以根据这个特性来区分现在在哪个进程中。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;pid_t pid = fork(); // 调用fork()克隆进程
if(pid == -1){    // 如果fork()返回-1，就说明在克隆进程时出了问题
    fprintf(stderr, &quot;Can&#039;t fork process: %s\n&quot;, strerror(errno));
    return 1;
}
if(!pid){    // 相当于if(pid == 0)，如果fork()返回0，说明代码运行在子进程中
    // code 子进程中的代码
}
// code 父进程中的代码&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;输入输出重定向&lt;/h4&gt;
&lt;p&gt;在介绍管道之前需要先讲下数据流，顾名思义，数据流就是流动的数据，数据从一个进程流出，然后流入另一个进程。&lt;/p&gt;
&lt;p&gt;操作系统中有三大默认数据流：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标准输入 stdin 默认是键盘输入&lt;/li&gt;
&lt;li&gt;标准输出 stdout 默认是屏幕输出&lt;/li&gt;
&lt;li&gt;标准错误 stderr 默认是屏幕输出&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还有其他形式的数据流，例如文件连接和网络连接也属于数据流。&lt;/p&gt;
&lt;p&gt;重定向进程的输出，相当于改变进程发送数据的方向。原本标准输出会把数据发送到屏幕，现在可以让它把数据发送到文件。&lt;/p&gt;
&lt;p&gt;进程含有它正在运行的程序，还有栈和堆数据空间。除此之外，进程还需要记录数据流的连向，比如标准输出连到了哪里。进程用&lt;strong&gt;文件描述符&lt;/strong&gt;表示数据流，所谓的描述符其实就是一个数字。进程会把文件描述符和对应的数据流保存在描述符表中。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;数据流&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;键盘&lt;/td&gt;
&lt;td&gt;标准输入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;屏幕&lt;/td&gt;
&lt;td&gt;标准输出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;屏幕&lt;/td&gt;
&lt;td&gt;标准错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;其他数据流形式&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;描述符表前三项万年不变：0号标准输入，1号标准输出，2号标准错误。&lt;/p&gt;
&lt;p&gt;标准输入/输出/错误在描述表中的位置是固定的，但是它们指向的数据流可以改变。也就是说，如果想重定向标准输出，只需要修改表中1号描述符对应的数据流就行了。所有向标准输出发送数据的函数会先查看描述符表，看1号描述符指向哪条数据流，然后再把数据写到这条数据流中，&lt;code&gt;printf()&lt;/code&gt;便是如此。&lt;/p&gt;
&lt;h4&gt;命令行中的数据流重定向&lt;/h4&gt;
&lt;p&gt;在命令行中用&lt;code&gt;&amp;gt;&lt;/code&gt;和&lt;code&gt;&amp;lt;&lt;/code&gt;运算符重定向数据流&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;./myprog &amp;gt; output.txt 2&amp;gt; errors.log&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的命令表示，标准输出到output.txt文件，标准错误到errors.log文件。&lt;code&gt;2&amp;gt;&lt;/code&gt;中的2就是标准错误在描述符表中的编号。在类Unix系统中，还可以把标准错误和标准输出到同一个地方：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;./myprog 2&amp;gt;&amp;amp;1&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;fileno()返回描述符号&lt;/h4&gt;
&lt;p&gt;每打开一个文件，操作系统都会在描述符表中新注册一项。假设你打开了某个文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;FILE *my_file = fopen(&quot;guitar.mp3&quot;, &quot;r&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;操作系统会打开guitar.mp3文件，然后返回一个指向它的指针，操作系统还会历遍描述符表寻找空项，把新文件注册在其中。&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;fileno()&lt;/code&gt;函数来查询文件指针它的描述符：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int descriptor = fileno(my_file);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;dup2()复制数据流&lt;/h4&gt;
&lt;p&gt;每次打开文件都会使用描述符表中新的一项。如果想修改某个已经注册过的数据流，比如想让3号描述符重新指向其他数据流，可以用&lt;code&gt;dup2()&lt;/code&gt;函数，&lt;code&gt;dup2&lt;/code&gt;可以复制数据流。假设你在4号描述符中注册了guitar.mp3文件指针，下面这行代码能同时把它连接到3号描述符：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;dup2(4,3);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;管道pipe&lt;/h3&gt;
&lt;h4&gt;如果创建管道？&lt;/h4&gt;
&lt;p&gt;因为子进程需要把数据发送到父进程，所以要用管道连接子进程的标准输出和父进程的标准输入。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pipe()&lt;/code&gt;函数会创建两条相连的数据流，并把它们加入到描述符表中，然后只要你往其中一条数据流中写数据，就可以从另一条数据流中读取。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;unistd.h&amp;gt;
int fd[2];  // 描述符将保存在这个数组中
if(pipe(fd) == -1){
    error(&quot;Can&#039;t creat the pipe&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;数据流&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;标准输入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;标准输出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;标准错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fd[0]&lt;/code&gt; 管道读取端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fd[1]&lt;/code&gt; 管道写入端&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;pipe()&lt;/code&gt;函数创建了管道，并返回了两个描述符：&lt;code&gt;fd[1]&lt;/code&gt;用来向管道&lt;strong&gt;写&lt;/strong&gt;数据，&lt;code&gt;fd[0]&lt;/code&gt;用来向管道&lt;strong&gt;读&lt;/strong&gt;数据，将会在父进程和子进程中使用它们。&lt;/p&gt;
&lt;h4&gt;最终程序&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;  // 提供 fork()，pipe() 函数
#include &amp;lt;errno.h&amp;gt;   // 提供 error()函数
#include &amp;lt;sys/types.h&amp;gt;  // 提供 pid_t

void error(char *msg)
{
    fprintf(stderr,&quot;%s: %s\n&quot;, msg, strerror(errno));
    exit(1);
}

int main(void){

    // 描述符将保存在这个数组中
    int fd[2];
    // pipe() 函数创建了管道，fd[1] 写管道，fd[0] 读管道
    if(pipe(fd) == -1){
        error(&quot;Can&#039;t create the pipe&quot;);
    }

    // 克隆进程
    pid_t pid = fork();
    if(pid == -1){
        error(&quot;Can&#039;t fork process&quot;);
    }

    // 进入子进程中
    if(!pid){
        dup2(fd[1], 1); // 将标准输出(描述符号是1)重定向到管道的写入端
        close(fd[0]);   // 因为子进程不需要从管道读取数据，所以关闭
        if(execl(&quot;/.../random_letter&quot;, &quot;/.../random_letter&quot;, NULL) == -1){
            error(&quot;Can&#039;t run random_letter&quot;);
        }
    }

    // 在父进程中
    dup2(fd[0], 0); // 将标准输入(描述符号是0)重定向到管道的读取端
    close(fd[1]);   // 因为父进程不需要向管道写入数据，所以关闭

    char res[255];
    // 从标准输入中获取数据
    while (fgets(res, 255, stdin))
    {
        printf(&quot;%s\n&quot;, res);       
    }   

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;《嗨翻C语言》&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E7%AE%A1%E9%81%93%E9%80%9A%E4%BF%A1.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E7%AE%A1%E9%81%93%E9%80%9A%E4%BF%A1.html</guid>
                                               <category>C</category>
                                    </item>
                <item>
            <title>Nginx-http-flv-module使用</title>
            <description>
            &lt;!--
author: admin
date: 2022-02-28
title: Nginx-http-flv-module使用
tags: nginx,flv,直播
category: Program
status: publish
summary: 终于可以摆脱VLC插件了
--&gt;
&lt;h1&gt;Nginx-http-flv-module使用&lt;/h1&gt;
&lt;p&gt;在之前的项目中，我使用了&lt;code&gt;VLC&lt;/code&gt;插件来播放海康的摄像头视频，但是需要浏览器支持&lt;code&gt;NPAPI&lt;/code&gt;插件，当时使用的是&lt;code&gt;Firefox 50.1.0&lt;/code&gt;，使用这么旧的版本很难受。。。想找一个原生支持视频播放的方法在新版本的浏览器上使用。&lt;/p&gt;
&lt;p&gt;在网上搜索一下，发现大部分的方法是使用&lt;code&gt;ffmepg&lt;/code&gt;将&lt;code&gt;RTMP&lt;/code&gt;流转为&lt;code&gt;FLV&lt;/code&gt;流，配合Bilibili的&lt;code&gt;flv.js&lt;/code&gt;来实现无插件播放&lt;/p&gt;
&lt;h4&gt;nginx-http-flv-module 使用&lt;/h4&gt;
&lt;p&gt;使用源码编译安装的方式，nginx编译之前有写，参考那里，&lt;code&gt;nginx-http-flv-module&lt;/code&gt;编译无非加上一句&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;./configure --add-module=/path/to/nginx-http-flv-module&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置 &lt;code&gt;nginx.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apacheconf&quot;&gt;# RTMP块
rtmp {
     server {
        listen 1935;
        chunk_size 4000;

        # Transcoding(ffmpeg need)
        application pull {
           live on;
           exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -c copy -f flv rtmp://localhost:1935/flv/${name};
        }
        application flv {
           live on;
        }
     }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里监听1935端口，视频源应当推流到 &lt;code&gt;rtmp://ip:1935/pull/{$name}&lt;/code&gt;，&lt;code&gt;$name&lt;/code&gt;可以自定义。此配置还同时启动了&lt;code&gt;ffmpeg&lt;/code&gt;将&lt;code&gt;rtmp&lt;/code&gt;转为&lt;code&gt;flv&lt;/code&gt;并推送到&lt;code&gt;application flv&lt;/code&gt;处。&lt;/p&gt;
&lt;p&gt;配置&lt;code&gt;sites-available&lt;/code&gt;目录内的&lt;code&gt;server.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;我这里创建了一个&lt;code&gt;live.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apacheconf&quot;&gt;server {
    listen 80;
    server_name localhost;

    location /stat {
        # 推流播放和录制统计数据的配置
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }

    location /stat.xsl {
        root /etc/nginx-http-flv-module/; # 指定 stat.xsl 的位置
    }

    location /live {
        flv_live on; # 打开 HTTP 播放 FLV 直播流功能
        chunked_transfer_encoding on; #支持 &#039;Transfer-Encoding: chunked&#039; 方式回复
        add_header &#039;Access-Control-Allow-Origin&#039; &#039;*&#039;;  # 避免CORS跨域被阻止
        add_header &#039;Access-Control-Allow-Credentials&#039; &#039;true&#039;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里定义一个&lt;code&gt;localhost&lt;/code&gt;服务器，&lt;code&gt;/stat&lt;/code&gt;用来查看&lt;code&gt;http-flv-module&lt;/code&gt;状态， &lt;code&gt;/stat.xsl&lt;/code&gt;中的&lt;code&gt;nginx-http-flv-module&lt;/code&gt;(就是下载来的源码)不要放在&lt;code&gt;root&lt;/code&gt;目录下&lt;/p&gt;
&lt;h4&gt;flv.js 使用&lt;/h4&gt;
&lt;p&gt;安装&lt;code&gt;npm&lt;/code&gt; &lt;code&gt;apt-get install npm -y&lt;/code&gt; 首次使用&lt;code&gt;npm&lt;/code&gt;时需要先&lt;code&gt;npm init -f&lt;/code&gt;否则会提示缺少&lt;code&gt;package.json&lt;/code&gt;文件&lt;/p&gt;
&lt;p&gt;安装&lt;code&gt;flv.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npm install --save flv.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在当前用户目录下找到&lt;code&gt;node_modules&lt;/code&gt;在里面就有了&lt;code&gt;flv.js&lt;/code&gt;目录&lt;/p&gt;
&lt;p&gt;在页面上使用&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hmtl&quot;&gt;&amp;lt;script src=&quot;../flv.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;video id=&quot;videoElement&quot;&amp;gt;&amp;lt;/video&amp;gt;
&amp;lt;script&amp;gt;
    if (flvjs.isSupported()) {
        var videoElement = document.getElementById(&#039;videoElement&#039;);
        var flvPlayer = flvjs.createPlayer({
            type: &#039;flv&#039;,
            url: &#039;http://example.com/flv/video.flv&#039;
        });
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load();
        flvPlayer.play();
    }
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中的&lt;code&gt;url&lt;/code&gt;改成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://localhost/live?port=1935&amp;amp;app=flv&amp;amp;stream=mystream&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数详解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;live ： &lt;code&gt;server&lt;/code&gt; 中的 &lt;code&gt;location /live&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;port ： &lt;code&gt;rtmp&lt;/code&gt;中&lt;code&gt;listen&lt;/code&gt;的&lt;/li&gt;
&lt;li&gt;app ：&lt;code&gt;rtmp&lt;/code&gt;中&lt;code&gt;application flv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;stream：自定义，需要和推流中的&lt;code&gt;{$name}&lt;/code&gt;相同&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之后即可在网页中直接查看直播了。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/winshining/nginx-http-flv-module&quot;&gt;GitHub - winshining/nginx-http-flv-module: Media streaming server based on nginx-rtmp-module. In addtion to the features nginx-rtmp-module provides, HTTP-FLV, GOP cache and VHOST (one IP for multi domain names) are supported now.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bilibili/flv.js&quot;&gt;GitHub - bilibili/flv.js: HTML5 FLV Player&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://segmentfault.com/q/1010000012930521&quot;&gt;npm install模块时 报错：not such file or directory。是何原因？ - SegmentFault 思否&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/28009037&quot;&gt;Nginx与Nginx-rtmp-module搭建RTMP视频直播和点播服务器 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Nginx-http-flv-module%E4%BD%BF%E7%94%A8.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Nginx-http-flv-module%E4%BD%BF%E7%94%A8.html</guid>
                                               <category>Program</category>
                                    </item>
                <item>
            <title>Java 抽象类</title>
            <description>
            &lt;!--
author: admin
date: 2022-02-18
title: Java 抽象类
tags: 编程
category: java
status: publish
summary: Java 太难学
--&gt;
&lt;h1&gt;Java 抽象类&lt;/h1&gt;
&lt;p&gt;Java 中有一个叫做&lt;strong&gt;抽象方法&lt;/strong&gt;的机制，它只有声明而没有方法体:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;abstract void functionName();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;包含抽象方法的类叫做&lt;strong&gt;抽象类&lt;/strong&gt;。如果一个类包含一个或多个抽象方法，那么这个类就必须限定为抽象类，否则编译器会报错。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;abstract class ClassName {
    abstract void functionName();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;抽象类不能被直接实例化：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;ClassName c = new ClassName(); // 编译器会报错&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果创建一个继承抽象类的新类，那么必须为它父类的所有抽象方法提供定义，如果不这么做，这个新类仍然是一个抽象类，编译器会强制我们为新类加上&lt;code&gt;abstract&lt;/code&gt;关键字。&lt;/p&gt;
&lt;p&gt;可以将一个不包含任何抽象方法的类声明为抽象类，这样做虽然有点别扭，但是它可以实现不能被实例化的特性。&lt;/p&gt;
&lt;p&gt;总结起来，抽象类有以下三类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仅包含抽象方法&lt;/li&gt;
&lt;li&gt;既包含抽象方法又包含常规方法&lt;/li&gt;
&lt;li&gt;仅包含常规方法，不包含抽象方法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个简单的示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class AbstractClassTest {

    public static void main(String[] args)
    {
        Bmw myCar = new Bmw();
        myCar.illuminate();
        myCar.soundWhistle();
    }
}

abstract class Car {
    /**
     * 鸣笛
     * 不同的汽车对于实现鸣笛的方式不同
     */
    abstract void soundWhistle();

    /**
     * 灯光
     * 每个车的灯光是一样的
     */
    public void illuminate()
    {
        System.out.println(&quot;Light On!&quot;);
    }

}

class Bmw extends Car {
    @Override
    void soundWhistle() {
        System.out.println(&quot;Bee Bee!&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;为什么需要抽象类和抽象方法呢？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;抽象方法和抽象类看上去是多余的，对于抽象方法，不知道如何实现，定义一个空方法体不就行了吗，而抽象类不让创建对象，看上去只是增加了一个不必要的限制。&lt;/p&gt;
&lt;p&gt;引入抽象方法和抽象类，是Java提供的一种语法工具，对于一些类和方法，引导使用者正确使用它们，减少被误用。&lt;/p&gt;
&lt;p&gt;使用抽象方法，而非空方法体，子类就知道他必须要实现该方法，而不可能忽略。&lt;/p&gt;
&lt;p&gt;使用抽象类，类的使用者创建对象的时候，就知道他必须要使用某个具体子类，而不可能误用不完整的父类。&lt;/p&gt;
&lt;p&gt;就好比定义了一个模板，你需要遵守规则的情况下来设计代码。&lt;/p&gt;
&lt;p&gt;另外，送上在&lt;a href=&quot;https://stackoverflow.com/questions/13670991/can-we-instantiate-an-abstract-class&quot;&gt;java - Can we instantiate an abstract class? - Stack Overflow&lt;/a&gt;看到的一个问题，抽象类真的不能被实例化吗？&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;
abstract class my {
    public void mymethod() {
        System.out.print(&quot;Abstract&quot;);
    }
}

class poly {
    public static void main(String a[]) {
        my m = new my() {};
        m.mymethod();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按照那个链接中网友所说的，这里的&lt;code&gt;m&lt;/code&gt;并不是严格意义上的抽象类实例化，而是实例化了抽象类的匿名子类。&lt;/p&gt;
&lt;p&gt;对象的实例化应该是&lt;code&gt;new ClassName();&lt;/code&gt;，分号在&lt;code&gt;()&lt;/code&gt;之后，而不是在&lt;code&gt;{}&lt;/code&gt;之后，那样的话是实例化了一个匿名类(&lt;em&gt;anonymous class&lt;/em&gt;)。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;抽象类和接口&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;抽象类和接口有类似之处，都不能用于创建对象，接口中的方法其实都是抽象方法。如果抽象类中只定义了抽象方法，那抽象类和接口就更像了。但抽象类和接口根本上是不同的，一个类可以实现多个接口，但只能继承一个类。&lt;/p&gt;
&lt;p&gt;抽象类和接口是配合而非替代关系，它们经常一起使用，接口声明能力，抽象类提供默认实现，实现全部或部分方法，一个接口经常有一个对应的抽象类。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/swiftma/p/5594961.html&quot;&gt;Java编程的逻辑 (20) - 为什么要有抽象类？ - 老马说编程 - 博客园 (cnblogs.com)&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Java_%E6%8A%BD%E8%B1%A1%E7%B1%BB.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Java_%E6%8A%BD%E8%B1%A1%E7%B1%BB.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>Java中的继承和抽象类</title>
            <description>
            &lt;h1&gt;Java中的继承和抽象类&lt;/h1&gt;
&lt;!--
author: admin
date: 2022-02-07
title: Java中的继承和抽象类
tags: 编程
category: java
status: publish
summary: 果然很抽象啊
--&gt;
&lt;h4&gt;继承&lt;/h4&gt;
&lt;p&gt;在面向对象程序设计中，继承(inheritance)是一个重要的概念。继承的基本思想是，可以基于已有的类创建新的类。继承已存在的类就是复用这些类的方法，而且可以增加一些新的方法和字段，使新类能够适应新的情况。&lt;/p&gt;
&lt;p&gt;已有的类称为超类(superclass)，继承它的新类称为子类(subclass)。子类能够拥有超类的方法，而且还能新增一些自己特有的方法。在《Java 核心技术·卷Ⅰ》中以员工和经理举例(P160)，代码如下&lt;/p&gt;
&lt;p&gt;先定义一个员工类&lt;code&gt;Employee&lt;/code&gt;,它属于超类&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package inheritance;

import java.time.*;

public class Employee {
    private String name;
    private double salary;
    private LocalDate hireDay;

    public Employee(String name, double salary, int year, int month, int day)
    {
        this.name = name;
        this.salary = salary;
        hireDay = LocalDate.of(year, month, day);
    }

    public String getName()
    {
        return name;
    }

    public double getSalary()
    {
        return salary;
    }

    public LocalDate getHireDay()
    {
        return hireDay;
    }

    public void raiseSalary(double byPercent)
    {
        double raise = salary * byPercent /100;
        salary += raise;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在定义一个经理类&lt;code&gt;Manager&lt;/code&gt;继承员工类，因为经理也是员工&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package inheritance;

public class Manager extends Employee {
    private double bonus;

    /**
     * @param name the employee&#039;s name
     * @param salary the salary
     * @param year the hire year
     * @param month the hire month
     * @param day the hire day
     */
    public Manager(String name, double salary, int year, int month, int day)
    {
        super(name, salary, year, month, day);
        bonus = 0;
    }

    public double getSalary()
    {
        double baseSalary = super.getSalary();
        return baseSalary + bonus;
    }

    public void setBonus(double bonus)
    {
        this.bonus = bonus;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;经理比普通员工多了奖金收入。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package inheritance;

/**
 * This program demonstrates inheritance.
 * @version 1.21 2022-02-06
 * @author syuez
 */
public class ManagerTest {
    public static void main(String[] args)
    {
        //construct a Manager object
        var boss = new Manager(&quot;Syuez&quot;, 80000, 1990, 8, 7);
        boss.setBonus(5000);

        var staff = new Employee[3];

        // fill the staff array with Manager and Employee objects
        staff[0] = boss;
        staff[1] = new Employee(&quot;Harry Hacker&quot;, 50000, 1989, 10, 1);
        staff[2] = new Employee(&quot;Tommy Tester&quot;, 40000, 1990, 3, 15);

        // print out information about all Employee objects
        for(Employee e : staff)
            System.out.println(&quot;name=&quot; + e.getName() + &quot;,salary=&quot; + e.getSalary());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个示例中，还使用了多态(polymorphism)，&lt;code&gt;for(Employee e : staff)&lt;/code&gt;中的&lt;code&gt;e&lt;/code&gt;既可以引用&lt;code&gt;Employee&lt;/code&gt;类型的对象，也可以引用&lt;code&gt;Manager&lt;/code&gt;类型的对象。&lt;/p&gt;
&lt;p&gt;当&lt;code&gt;e&lt;/code&gt;引用&lt;code&gt;Employee&lt;/code&gt;对象时，&lt;code&gt;e.getSalary()&lt;/code&gt;调用的是&lt;code&gt;Employee&lt;/code&gt;类中的&lt;code&gt;getSalary&lt;/code&gt;方法；当&lt;code&gt;e&lt;/code&gt;引用&lt;code&gt;Manager&lt;/code&gt;对象时，&lt;code&gt;e.getSalary()&lt;/code&gt;调用的是&lt;code&gt;Manager&lt;/code&gt;类中的&lt;code&gt;getSalary&lt;/code&gt;方法。虚拟机知道&lt;code&gt;e&lt;/code&gt;实际引用的对象类型，因此能够正确地调用相应的方法。&lt;/p&gt;
&lt;h4&gt;抽象类&lt;/h4&gt;
&lt;p&gt;在此之前，我一直不太明白抽象类的意义是什么，直到我看了书上的示例代码时明白了(这真是一本好书啊)。&lt;/p&gt;
&lt;p&gt;这里接上继承的例子，定义了一个更具有普遍意义的抽象类&lt;code&gt;Person&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package abstractClasses;

public abstract class Person {
    public abstract String getDescription();
    private String name;

    public Person(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;抽象类&lt;code&gt;Person&lt;/code&gt;很简单，除了定义具体的字段和方法之外，还定义了一个抽象方法&lt;code&gt;getDescription()&lt;/code&gt;，使用&lt;code&gt;abstract&lt;/code&gt;关键字描述的抽象方法不需要具体实现。抽象方法充当占位方法的角色，它们在子类中具体实现。即使不含抽象方法，也可以将类声明为抽象类。&lt;/p&gt;
&lt;p&gt;分别定义一个&lt;code&gt;Employee&lt;/code&gt;类和&lt;code&gt;Student&lt;/code&gt;类来继承抽象类&lt;code&gt;Person&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package abstractClasses;

import java.time.*;

public class Employee extends Person {
    private double salary;
    private LocalDate hireDay;

    public Employee(String name, double salary, int year, int month, int day)
    {
        super(name);
        this.salary = salary;
        hireDay = LocalDate.of(year, month, day);
    }

    public double getSalary()
    {
        return salary;
    }

    public LocalDate getHireDay()
    {
        return hireDay;
    }

    @Override
    public String getDescription()
    {
        return String.format(&quot;an employee with a salary of $%.2f&quot;,salary);
    }

    public void raiseSalary(double byPercent)
    {
        double raise = salary * byPercent / 100;
        salary += raise;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package abstractClasses;

public abstract class Person {
    public abstract String getDescription();
    private String name;

    public Person(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;package abstractClasses;

/**
 * This program demonstrates abstract classes.
 * @version 1.01 2022-02-07
 * @author syuez
 */

public class PersonTest {

    public static void main(String[] args)
    {
        var people = new Person[2];
        // fill the pepole array with Student and Employee objects
        people[0] = new Employee(&quot;Harry Hacker&quot;, 50000, 1989, 10, 1);
        people[1] = new Student(&quot;Maria Morris&quot;, &quot;computer science&quot;);

        // print out names and descriptions of all Person objects
        for(Person p : people)
            System.out.println(p.getName() + &quot;,&quot; + p.getDescription());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;p.getDescription()&lt;/code&gt;可能让人疑惑，这不是调用了一个没有定义的方法吗？由于不能构造抽象类&lt;code&gt;Person&lt;/code&gt;的对象，所以变量&lt;code&gt;p&lt;/code&gt;永远不会引用&lt;code&gt;Person&lt;/code&gt;对象，而是引用诸如&lt;code&gt;Employee&lt;/code&gt;或&lt;code&gt;Student&lt;/code&gt;这样的具体子类对象，而这些对象中都定义了&lt;code&gt;getDescription()&lt;/code&gt;方法。&lt;/p&gt;
&lt;p&gt;是不是和继承中的&lt;code&gt;e&lt;/code&gt;异曲同工呢？&lt;code&gt;e&lt;/code&gt;体现了多态，变量&lt;code&gt;e&lt;/code&gt;可以是任意一个子类对象变量，而&lt;code&gt;p&lt;/code&gt;又代表了超类也可以调用不同子类对象中的方法。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Java%E4%B8%AD%E7%9A%84%E7%BB%A7%E6%89%BF%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Java%E4%B8%AD%E7%9A%84%E7%BB%A7%E6%89%BF%E5%92%8C%E6%8A%BD%E8%B1%A1%E7%B1%BB.html</guid>
                                               <category>java</category>
                                    </item>
                <item>
            <title>使用本地phpMyAdmin连接远程服务器上的MySQL</title>
            <description>
            &lt;!--
author: admin
date: 2019-12-18
title: 使用本地phpMyAdmin连接远程服务器上的MySQL
tags: MySQL
category: Linux
status: publish
summary: 一切皆可SSH😰
--&gt;
&lt;h4&gt;使用本地phpMyAdmin连接远程服务器上的MySQL&lt;/h4&gt;
&lt;p&gt;因为基于安全原因，远程服务器上的MySQL数据库是禁止对外开放端口的（防火墙未开启3306端口开放），而且&lt;code&gt;bind-address = 127.0.0.1&lt;/code&gt;仅在本地运行。但是有时候又想要GUI界面操作一下，毕竟CLI一大串命令太难了😂（我不会~）&lt;/p&gt;
&lt;h4&gt;准备工作&lt;/h4&gt;
&lt;p&gt;远程服务器上MySQL运行正常，就是没有乱改什么限制，毕竟我只会一点点技能。&lt;/p&gt;
&lt;p&gt;Windows 下SSH客户端，比如 Win10 自带的 SSH 或者XShell等等。&lt;/p&gt;
&lt;p&gt;本地安装phpMyAdmin，我这里使用了 &lt;a href=&quot;https://usbwebserver.yura.mk.ua/&quot;&gt;USBWebserver v8.6.2&lt;/a&gt; 直接解压运行，开箱即用&lt;/p&gt;
&lt;h4&gt;SSH隧道&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;命令行&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -fCPN –L 3307:localhost:3306 -p 1046 root@remotehost
# 参数解释
# -C    使用压缩功能,是可选的,加快速度.
# -P    用一个非特权端口进行出去的连接.
# -f    一旦SSH完成认证并建立port forwarding,则转入后台运行.
# -N    不执行远程命令.该参数在只打开转发端口时很有用（V2版本SSH支持）
# localhost:3306 连接远程主机本地连接的MySQL3306端口
# root@remotehost 远程主机的登录用户名和IP
# 3307 在本地主机建立一个3307的端口
# -p 1046 远程主机的SSH端口&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入密钥后，在没有报错的情况下，本地3307端口到远程主机的3306端口就建立了一条SSH隧道&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;XShell&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;第一步,设置SSH连接,这与普通的SSH连接一模一样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1576656389366.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第二步,设置SSH隧道&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1576656504879.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第三步,设置完成以后,点击确定,并且使用SSH登录到远程服务器,以便打开SSH隧道。&lt;/p&gt;
&lt;h4&gt;本地phpMyAdmin&lt;/h4&gt;
&lt;p&gt;解压&lt;code&gt;USBWebserver v8.6.2&lt;/code&gt;打开&lt;code&gt;phpmyadmin&lt;/code&gt;文件夹，然后打开&lt;code&gt;config.inc.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1576656690050.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1576656765803.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;编辑&lt;code&gt;$cfg[&#039;Servers&#039;][$i][&#039;host&#039;] = &#039;localhost:3307&#039;;&lt;/code&gt;这行（就是加个端口号）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1576656873045.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着运行&lt;code&gt;usbwebserver.exe&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1576656627073.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1576657001679.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1576657015116.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后点击常规里面的&lt;code&gt;PHPMyAdmin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1576657069951.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;会自动打开浏览器到phpMyAdmin的登录页面，输入远程服务器上MySQL的账号密码即可&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://mingxinglai.com/cn/2015/09/connect-mysql-via-ssh-tunnel/&quot;&gt;使用SSH隧道连接MYSQL&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.v2ex.com/t/211956&quot;&gt;VPS 上使用 phpMyAdmin 会不会很不安全？&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8%E6%9C%AC%E5%9C%B0phpMyAdmin%E8%BF%9E%E6%8E%A5%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84MySQL.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8%E6%9C%AC%E5%9C%B0phpMyAdmin%E8%BF%9E%E6%8E%A5%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84MySQL.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>Nginx 配置</title>
            <description>
            &lt;!--
author: admin
date: 2019-12-12
title: Nginx 配置
tags: nginx
category: Linux
status: publish
summary: 还是Nginx看得懂😭
--&gt;
&lt;h4&gt;Nginx 配置&lt;/h4&gt;
&lt;p&gt;本文默认后端程序为&lt;code&gt;PHP&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/usr/local/nginx/conf/nginx.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 全局块
user www-data;
pid /run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;
# events块
events {
    multi_accept on; #设置一个进程是否同时接受多个网络连接，默认为off
    worker_connections 65535; #最大连接数，默认为512
}
# http块
http {
    charset utf-8; #字符集
    sendfile on; #允许sendfile方式传输文件，默认为off，可以在http块，server块，location块
    tcp_nopush on; # TCP优化
    tcp_nodelay on; # TCP优化
    server_tokens off; # 隐藏版本号
    log_not_found off; # 文件未找到是否记录到 error 日志
    types_hash_max_size 2048;
    client_max_body_size 16M; #允许客户端请求的最大单文件字节数。如果有上传较大文件，请设置它的限制值
    keepalive_timeout 65;  #连接超时时间，默认为75s，可以在http，server，location块
    # MIME
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型，默认为text/plain

    # logging
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;

    # SSL
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;

    # Mozilla Modern configuration
    ssl_protocols TLSv1.3;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 1.1.1.1 1.0.0.1 valid=60s;
    resolver_timeout 2s;

    # load configs
    include /usr/local/nginx/conf/conf.d/*.conf;
    include /usr/local/nginx/conf/sites-available/*.conf;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/usr/local/nginx/conf/sites-available/www.domain.com.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    listen 443 ssl http2;

    server_name www.domain.com;
    set $base /var/www/domain;
    root $base;

    # SSL
    ssl_certificate /usr/local/nginx/conf/ssl/www.domain.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/ssl/www.domain.com.key;

    # security
    include nginxconfig.io/security.conf;

    # logging
    access_log /var/log/nginx/www.domain.com.access.log;
    error_log /var/log/nginx/www.domain.com.error.log warn;

    # index.php
    index index.php;

    # index.php fallback
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # handle .php
    location ~ \.php$ {
        include nginxconfig.io/php_fastcgi.conf;
    }

    # additional config
    include nginxconfig.io/general.conf;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/usr/local/nginx/conf/nginxconfig.io/security.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# security headers
add_header X-Frame-Options &quot;SAMEORIGIN&quot; always;
add_header X-XSS-Protection &quot;1; mode=block&quot; always;
add_header X-Content-Type-Options &quot;nosniff&quot; always;
add_header Referrer-Policy &quot;no-referrer-when-downgrade&quot; always;
add_header Content-Security-Policy &quot;default-src &#039;self&#039; http: https: data: blob: &#039;unsafe-inline&#039;&quot; always;
add_header Strict-Transport-Security &quot;max-age=31536000; includeSubDomains; preload&quot; always;

# . files
location ~ /\.(?!well-known) {
    deny all;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/usr/local/nginx/conf/nginxconfig.io/php_fastcgi.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 404
try_files $fastcgi_script_name =404;

# default fastcgi_params
include fastcgi_params;

# fastcgi settings
fastcgi_pass            127.0.0.1:9000;
fastcgi_index           index.php;
fastcgi_buffers         8 16k;
fastcgi_buffer_size     32k;

# fastcgi params
fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/usr/local/nginx/conf/nginxconfig.io/general.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# favicon.ico
location = /favicon.ico {
    log_not_found off;
    access_log off;
}

# robots.txt
location = /robots.txt {
    log_not_found off;
    access_log off;
}

# assets, media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
    expires 7d;
    access_log off;
}

# svg, fonts
location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
    add_header Access-Control-Allow-Origin &quot;*&quot;;
    expires 7d;
    access_log off;
}

# gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nginxconfig.io/&quot;&gt;NGINX Config&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://juejin.im/post/5aa7704c6fb9a028bb18a993&quot;&gt;Nginx 基本配置详解&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Nginx_%E9%85%8D%E7%BD%AE.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Nginx_%E9%85%8D%E7%BD%AE.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>sudo的安全策略：阻止/允许用户执行特定命令</title>
            <description>
            &lt;!--
author: admin
date: 2019-11-06
title: sudo的安全策略：阻止/允许用户执行特定命令
tags: Ubuntu
category: Linux
status: publish
summary: 本文转载自网络,有增删改,来源见文末
--&gt;
&lt;h4&gt;sudo的安全策略：阻止/允许用户执行特定命令&lt;/h4&gt;
&lt;h4&gt;添加新用户&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;adduser shi&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按照提示一步一步操作&lt;/p&gt;
&lt;h4&gt;安装sudo&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;apt-get update
apt-get install sudo -y&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;配置sudo&lt;/h4&gt;
&lt;p&gt;首先，将用户移除sudo用户组（如果原来在的话）&lt;/p&gt;
&lt;p&gt;然后，确认/etc/sudoers配置策略&lt;/p&gt;
&lt;p&gt;要使用visudo来编辑，默认该文件带有描述：“This file MUST be edited with the ‘visudo’ command as root”。如果没有改动过该文件，其大致如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# User privilege specification
root    ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on &quot;#include&quot; directives:
#includedir /etc/sudoers.d&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，编辑用户安全策略配置&lt;/p&gt;
&lt;p&gt;在/etc/sudoers.d/目录下建立与用户同名的策略文件，比如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;visudo -f /etc/sudoers.d/shi #其中“shi”为测试建立的用户名&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;比如，我们期望用户test 可以以管理员权限执行/usr/bin、/bin下的所有命令，但是不能修改其他用户密码以及kill其他用户进程，可以配置如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;shi ALL=/usr/bin/, !/usr/bin/passwd, /bin/, !/bin/kill&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试一下，会发现passwd被阻止了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo passwd
[sudo] password for shi: 
Sorry, user shi is not allowed to execute &#039;/usr/bin/passwd&#039; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在策略文件中配置：&lt;code&gt;!/usr/bin/passwd user_name&lt;/code&gt;，该策略可以阻止修改特定用户的密码。也可以得知，该策略可以阻止特定参数的命令&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/saga1979/article/details/87929605&quot;&gt;sudo的安全策略：阻止/允许用户执行特定命令&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/a19881029/article/details/18730671&quot;&gt;Linux用户配置sudo权限(visudo)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://s.v2ex.com/t/588712&quot;&gt;A 和 B 假如都是 sudo 组，那如何阻止 B 把 A 给踢出 sudo 组&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%85%81%E8%AE%B8%E7%94%A8%E6%88%B7%E6%89%A7%E8%A1%8C%E7%89%B9%E5%AE%9A%E5%91%BD%E4%BB%A4.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%85%81%E8%AE%B8%E7%94%A8%E6%88%B7%E6%89%A7%E8%A1%8C%E7%89%B9%E5%AE%9A%E5%91%BD%E4%BB%A4.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>php-console使用小记</title>
            <description>
            &lt;!--
author: admin
date: 2019-09-29
title: php-console使用小记
tags: debug
category: PHP
status: publish
summary: 终于可以愉快的打印变量了
--&gt;
&lt;h4&gt;php-console使用小记&lt;/h4&gt;
&lt;p&gt;因为要调试服务器上的代码和变量，但是直接&lt;code&gt;var_dump&lt;/code&gt;有风险，所以开始寻找便捷和安全的方案，然后找到了这个&lt;code&gt;php-console&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;官方推荐使用&lt;code&gt;Composer&lt;/code&gt;包管理器，因为我本地是Windows，服务器是CentOS，太麻烦了，所以直接下载源码文件，手动加入好了。&lt;/p&gt;
&lt;p&gt;下载&lt;a href=&quot;https://github.com/barbushin/php-console/archive/master.zip&quot;&gt;源码&lt;/a&gt;，解压，找到&lt;code&gt;src&lt;/code&gt;目录，把里面的整个&lt;code&gt;PhpConsole&lt;/code&gt;目录拷贝到网站根目录下&lt;/p&gt;
&lt;p&gt;在需要调试的php文件头部添加：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
require_once __DIR__ . &#039;&amp;lt;path&amp;gt;/PhpConsole/__autoload.php&#039;;
function debug($var, $tags = null) {
    PhpConsole\Connector::getInstance()-&amp;gt;getDebugDispatcher()-&amp;gt;dispatchDebug($var, $tags, 1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面定义了一个&lt;code&gt;debug&lt;/code&gt;函数，之后就可以使用这个函数打印变量了，更多用法请查看官方Github&lt;/p&gt;
&lt;p&gt;其中，&lt;code&gt;__DIR__&lt;/code&gt;魔术变量指的是当前文件的位置，&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
require_once __DIR__ . &#039;/&#039;          #指当前目录下
require_once __DIR__ . &#039;/../&#039;       #指当前目录的上一级目录
require_once __DIR__ . &#039;/../../&#039;    #指当前目录的上两级目录&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用Chrome安装&lt;a href=&quot;https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef&quot;&gt;PHP Console extension&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;之后就可以使用Chrome的开发者工具中的Console查看和调试了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1569740859286.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1569740880084.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1569740980930.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/barbushin/php-console&quot;&gt;Github·php-console&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/u0mo5/p/4726764.html&quot;&gt;PHP Console工具使用分享&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://segmentfault.com/q/1010000000688218&quot;&gt;PHP生产环境的bug如何优雅地debug？&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/php-console%E4%BD%BF%E7%94%A8%E5%B0%8F%E8%AE%B0.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/php-console%E4%BD%BF%E7%94%A8%E5%B0%8F%E8%AE%B0.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>HTML&CSS&JavaScript思维导图</title>
            <description>
            &lt;!--
author: poos
date: 2019-09-24
title: HTML&amp;CSS&amp;JavaScript思维导图
tags: 前端
category: 转载
status: publish
summary: null
--&gt;
&lt;h4&gt;HTML&amp;amp;CSS&amp;amp;JavaScript思维导图&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./img/1569303280974.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.poos.cn/article/73&quot;&gt;https://www.poos.cn/article/73&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/HTML_CSS_JavaScript%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/HTML_CSS_JavaScript%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>你看那个人，好奇怪哟，像一条狗</title>
            <description>
            &lt;!--
author: 苗汉子
date: 2019-09-01
title: 你看那个人，好奇怪哟，像一条狗
tags: 爱情,人生,思考
category: 转载
status: publish
summary: 总有一天你也会走在路上，像一条狗。
--&gt;
&lt;h4&gt;你看那个人，好奇怪哟，像一条狗&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./img/1567302217421.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1567302247140.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;你在看大话西游的时候，如果笑得腹背抽筋，龇牙咧嘴，那么你很有幽默感。如果你看完了大话西游，你还笑得满地打滚，那么你其实什么都没看懂。如果你看完了大话，你忽然发现脸上不知什么时候已经有泪水，你总算看懂了大话的第一层了。如果你看完大话，笑也笑过了，泪也流过了，忽然怔在那里，忽然觉得不知是该哭还是该笑，那么你看懂第二层了。如果你看完了大话，默默的坐在那里，你感到无处可去，你感到一种深入骨髓的悲哀和无奈,你看懂第三层了。&lt;/p&gt;
&lt;p&gt;大话西游是个寓言,躲在古老神话的背壳里似乎很搞笑很爱情很世俗很感伤地讲述一个因为时间的渺茫和个体的彷徨所构筑的问题和它不确定的答案。&lt;/p&gt;
&lt;p&gt;&amp;quot;那个人样子好怪。&amp;quot; &amp;quot;我也看到了，他好像一条狗。&amp;quot; 大话西游的最后一句对白你还记得么。其实这一句，就是整个电影的主题。用男人的思想就是：一个男人的无奈。&lt;/p&gt;
&lt;p&gt;你喜欢至尊宝，还是喜欢孙悟空？答案不言自明。至尊宝放荡不羁，无拘无绊，但敢爱敢恨，纯真可爱。那么你又仰慕谁？谁是英雄？&lt;/p&gt;
&lt;p&gt;其实从至尊宝到孙悟空的蜕变，正是反应了一个从男孩到男人的心路历程。&lt;/p&gt;
&lt;p&gt;&amp;quot;等你明白了舍生取义的道理，你自然会回来和我唱这首歌的。&amp;quot;&lt;/p&gt;
&lt;p&gt;唐僧是谁？我们是不是想起了我们的父母，我们的老师，我们的前辈。哪一个男人没有经历过他们的谆谆教导，又有哪一个人没有产生过一种强烈的逆反心理，没有反抗。但是，当每一个人成熟起来后，成为了男人，都会由衷地感谢他们的教诲，或者后悔没有听他们的话。&lt;/p&gt;
&lt;p&gt;&amp;quot;我知道有一天他会在一个万众瞩目的情况下出现，身披金甲圣衣，脚踏七色云彩来娶我。&amp;quot;紫霞仙子是那种令每一个男孩子倾心的女性，她对自己的意中人要求不高，仅此而已，但是试问，你能做到吗？至尊宝做到了吗？他做到了，不过代价却是......其实，紫霞仙子就是我们心目中的女性形象，她的要求就代表了女性对男人的要求。&lt;/p&gt;
&lt;p&gt;牛魔王又是谁？他代表了这世界上一种无形的力量，他夺走了紫霞，夺走了晶晶，也夺走了至尊宝的快乐。这种力量使至尊宝和他代表的男孩子们失去了往日的伊甸园，要想找回昔日的快乐，就必须战胜它。&lt;/p&gt;
&lt;p&gt;说到这里，先整理一下思路，看看我们发现了什么。随着牛魔王的出现，至尊宝再也不能享受往日无忧的时光。他要找回心爱的晶晶，也要夺回更加深爱的紫霞。他曾一度寄望于月光宝盒转自，是的，月光宝盒。它有一种神奇的力量，可以使至尊宝避开同牛魔王直接交锋而获得自己想要的东东。其实，每一个男孩子在成长的过程中都曾经有过这样的幻想，但是，面对无情的现实，幻想一次又一次地破灭。直到最后的关头，至尊宝终于醒悟，靠月光宝盒不行，至尊宝更是没有那个本事，只有成为孙悟空，只有戴上那个金刚圈，他才有能力同牛魔王一较高下。&lt;/p&gt;
&lt;p&gt;这真是一个极大的讽刺。你想要得到吗？那么好吧，你先放弃吧。你必须做出选择，作至尊宝，那么快乐总是很短暂，作孙悟空，你就要忍受无尽的痛苦。这个世界的规则好象是牛魔王制定的，那么恶毒，在它面前，那段经典的台词显得多么的苍白无力，只能成为一个男孩子蜕变成男人的时候留在心底最深的伤痛。&lt;/p&gt;
&lt;p&gt;唐僧说话的方式从来就没有变过，只是在至尊宝醒悟的前后听来有完全不同的感受。那么至尊宝是自觉自愿的醒悟吗？不，他并不愿意，但是他必须拯救紫霞，必须化解人间的恨，他别无选择。虽然成为了孙悟空，成了大英雄，但他对自己的生存状态极度不满。片子的最后，孙悟空将他心中残存的至尊宝的影子幻化作一位夕阳武士，在对现实世界彻底失望后，只能构造一个虚幻的想象来了却这桩心愿，并借武士的口中表达了对自己生存状态的不满，活得好象是一条狗一样。唉，一个男人的悲怆和无奈。&lt;/p&gt;
&lt;p&gt;&amp;quot;生又何哀，死又何苦。&amp;quot;&lt;/p&gt;
&lt;p&gt;很早就听说过，如果你能理解大话中，&amp;quot;他好象一条狗&amp;quot;那么你才是真正理解了《大话》&lt;/p&gt;
&lt;p&gt;也许我还不能完全明白..............喜欢大话喜欢那种明明相爱却又不能死守终生的遗憾和悲哀。我只能这样骗自己，也许他也有他的苦衷。发现自己真的的接近于疯狂。大概是太过于同情怜悯自己了，才深深地喜欢着这个故事。&lt;/p&gt;
&lt;p&gt;爱情篇罗曼蒂克、海誓山盟、生死相许……面对爱情这些都是琐碎，不值一提。爱情就是爱情，不是别的什么东西。能与爱情同在的只有生命，其他都滚一边儿去. 你爱了，难道还不够吗？&lt;/p&gt;
&lt;p&gt;悟空爱了，不论晶晶还是紫霞，他都要将爱情进行到底。紫霞爱了，“谁拔出我的紫青宝剑，谁就是我的如意郎君。” 爱一个人需要理由吗？&lt;/p&gt;
&lt;p&gt;孙悟空会爱白骨精，猪八戒爱上了蜘蛛精。紫霞爱他至深，因为他拔出了一把剑。故事里的人找爱人的理由永远千奇百怪：王子要用水晶鞋才能找到灰姑娘，薛宝钗要那有玉的人来配……可生活永远现实得多，芸芸众生，谁又能许谁一个未来，自欺欺人罢了。&lt;/p&gt;
&lt;p&gt;有理由也好，没理由也罢，可还是要爱。让我去，过程就是结果，无悔。&lt;/p&gt;
&lt;p&gt;爱无须掩饰无须矫做无须患得患失，只要像紫霞一样说：“让我们立刻开始这段感情吧！先亲我一下。” 爱是身不由己。&lt;/p&gt;
&lt;p&gt;至尊宝梦中也要叫紫霞的名字七百四十一次，不知道的人觉得紫霞一定欠了他很多钱。紫霞说：“就象飞蛾，明知会受伤也要扑到火上。”“我无力抗拒，向你狂奔去。”无可救药的痴迷。爱是奋不顾身。&lt;/p&gt;
&lt;p&gt;至尊宝对晶晶说：“你杀了我吧，我不希望你看我的时候心里却想着别的人。”晶晶以为：“都是骗我的。”跳下崖去。紫霞把身体挡在至尊宝面前，刺进牛魔王的铁叉里。一时间，以后的人生如何，大家都无所谓了。连那样宝贵的性命，也打算随时给爱作了祭品。一个个一头扎进这情爱苦海，宁愿永生永世不得超生。爱深刻莫测。&lt;/p&gt;
&lt;p&gt;三十娘流着泪说：“想我春三十娘貌美如花，却跟这么丑的人有了。”这是多少美丽自负的女子的宿命：心中的他是能文能武翩翩少年，枕边人却鼾声如雷大腹便便。谁敢说多年后眼望自己的丈夫或妻子不会有如此感觉，真不知幸福还是心酸。不过还是要为他挺身而去无限牺牲，像春三十娘为猪八戒放下断龙石与牛魔王同归于尽。&lt;/p&gt;
&lt;p&gt;至尊宝爱晶晶，紫霞爱至尊宝，“他爱你你爱我我爱他”，千古无解的方程。所以紫霞说：“爱一个人原来是那么痛苦。&lt;/p&gt;
&lt;p&gt;至尊宝原以为可以与初恋共度今生，谁知初恋的时候并不懂情爱人生。当年被他推开的紫霞已经悄无声息地抵达他灵魂的最深处，而他却不自知。可紫霞死了：“我的意中人是个盖世英雄，有一天他会踩着七色的云彩来娶我，我猜中了前头，可是我猜不着这结局……” 没有人猜得中结局，一切随风而去。&lt;/p&gt;
&lt;p&gt;恋爱的时候我们都不懂爱情，懂得爱情后却失去了可以相爱的时间。&lt;/p&gt;
&lt;p&gt;最绝望不是他不爱你或他离你而去，最绝望是你忘记了怎么去爱一个人，你已丧失了爱的能力。&lt;/p&gt;
&lt;p&gt;请记住下面的台词：“曾经有一份真诚的爱情摆在我的面前，但是我没有珍惜。等到了失去的时候才后悔莫及，尘世间最痛苦的事莫过于此。如果上天可以给我一个机会再来一次的话，我会对你说三个字”我爱你“。如果非要把这份爱加上一个期限，我希望是一万年！”也顺便记住这段话的原版，在王家卫的《重庆森林》里：“如果记忆是一个罐头，我希望它永远都不会过期，如果一定要加上一个期限的话，我希望是一万年。”&lt;/p&gt;
&lt;p&gt;至尊宝第一次说这番话是骗紫霞，第二次说已痛不欲生。或许命运是总有一天，我会在灵魂最温柔的一隅为你重复这段话，为了我们即将封存的一万年。&lt;/p&gt;
&lt;p&gt;此情可待成追忆 只是当时已惘然！&lt;/p&gt;
&lt;p&gt;人或仙，妖或魔，都不能脱离尘世，都不会彻底陈腐。《大话西游》无论有多少时空要穿越，无论有多少玩笑要铺陈，无论有多少荒谬要展现，都是一场戏，所以牛魔王包二奶，孙大圣娶妻都在戏里，白晶晶既使没有刷牙，也可以象紫霞一样滴下同样意义泪。在传统港式的搞笑动作恐怖等等一切元素的包装之下，《大话西游》有意义在，有永远流传的风华。&lt;/p&gt;
&lt;p&gt;“这时候的孩子都是玻璃罐里养蛤蟆，前途光明出路不大。”而你说，在妈那里自己永远是个孩子。居然再贴切不过。大闹天宫无非是20——22岁的黄金时光罢了，找到工作走上社会任你盖世的才华、浑身的个性也自有翻不出的五指山来压。只有戴上紧箍咒取经去，九九八十一难，做一个奇奇怪怪的佛。&lt;/p&gt;
&lt;p&gt;你别无选择。五百年后的悟空叫至尊宝，在五岳山从事一份很有前途的职业——山贼。命运却要他扮演孙悟空，至尊宝只是个过渡罢了。&lt;/p&gt;
&lt;p&gt;蜘蛛精来了，白骨精来了，菩你老母来了，牛魔王也来了……都是棋子，安静地立在命运棋盘的中央。&lt;/p&gt;
&lt;p&gt;他的路线是早定好的：（1）一个人给他三颗痣（2）戴上紧箍咒（3）打败牛魔王（4）西天取经。&lt;/p&gt;
&lt;p&gt;可怜的至尊宝什么都不知道，认认真真做山贼，还以为爱上了白骨精，和她结为百年之好。所有的事都瞒着他接二连三地发生。&lt;/p&gt;
&lt;p&gt;真相将揭晓，在我临死的瞬间。&lt;/p&gt;
&lt;p&gt;给至尊宝三颗痣的人是紫霞仙子。谁说的：如果你要真正了解一个人，就要认认真真的爱她，用心和她在一起。而爱上她就等于失去她，那简直是一定的。&lt;/p&gt;
&lt;p&gt;非常喜欢紫霞的开场白：“现在我郑重宣布，这座山上所有的东西都是我的，包括你。”那样的气贯云霄，像一个童话故事。&lt;/p&gt;
&lt;p&gt;而现实是：这个世界没有什么属于你，包括你自己。也许我们就是为了创造属于自己的东西才来到这个世上，因为年轻，所以押注于爱情。至尊宝拒绝了紫霞，他以为自己还爱晶晶。见到晶晶，他又发现紫霞才是真爱。&lt;/p&gt;
&lt;p&gt;命运一直在同他开玩笑：至尊宝忽然成了孙悟空，千辛万苦找晶晶又爱上了紫霞。而抉择是那样残酷：要打败牛魔王救紫霞，就必须戴上紧箍咒做回神通广大的孙悟空；而戴上紧箍咒就不能有半点情欲，只有取经去。&lt;/p&gt;
&lt;p&gt;为至尊宝不平：不明白在这样的故事里为何爱情总要成为牺牲品，干嘛不让至尊宝携紫霞纤纤小手——走先！我曾无数次在发表过类似意见，搞得很累。&lt;/p&gt;
&lt;p&gt;爱情是那样美丽而脆弱，无法直面生活的琐碎和坚韧。哪段感情又没有绚烂的瞬间和艰难的长久，在一起就会幸福吗，未必。未必的未必，也未必。我可以等待，这是个决定。&lt;/p&gt;
&lt;p&gt;至尊宝挖开自己的心，看到了紫霞留在那里的一滴眼泪，毕竟曾经沧海过。五百年又五百年，兜了一个大圈子又回到了原地。人没能战胜命运，而人的尊严却在抗争中得到了肯定，人的情感也必将不朽。&lt;/p&gt;
&lt;p&gt;“生亦何欢，死亦何苦。”大彻大悟。紧箍咒，圈住昔日的梦想，圈住棱角分明的个性。成熟是一个很痛的词，它不一定会得到，却一定会失去。望着荧幕上渐渐飘远的紫霞，忽地明白了其实这是很自私的结局，这就是自私的好处至尊宝忘记或记得自己都不重要全片最后一句台词是：“你看那个人，好奇怪哟，像一条狗。”总有一天你也会走在路上，像一条狗。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://movie.douban.com/review/5199026/&quot;&gt;你理解大话西游片尾那句“他好像一条狗”吗？如果不能理解，那就是没看懂。&lt;/a&gt; 标题有修改&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BD%A0%E7%9C%8B%E9%82%A3%E4%B8%AA%E4%BA%BA_%E5%A5%BD%E5%A5%87%E6%80%AA%E5%93%9F_%E5%83%8F%E4%B8%80%E6%9D%A1%E7%8B%97.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BD%A0%E7%9C%8B%E9%82%A3%E4%B8%AA%E4%BA%BA_%E5%A5%BD%E5%A5%87%E6%80%AA%E5%93%9F_%E5%83%8F%E4%B8%80%E6%9D%A1%E7%8B%97.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>什么才是「正确的事情」？</title>
            <description>
            &lt;!--
author: 秋雨梧桐
date: 2019-08-13
title: 什么才是「正确的事情」？
tags: 思考
category: 转载
status: publish
summary: 经济学的基本原理之一就是边际收益递减,所有你没有太多的选择。
--&gt;
&lt;h4&gt;什么才是「正确的事情」？&lt;/h4&gt;
&lt;p&gt;有关正确的事情&lt;/p&gt;
&lt;p&gt;有关 Do the right thing 和 Do thing right，这个选择题大家可能做过很多次了，大多数人，都能毫不犹豫的选出最重要的是「Do the right thing」。但是具体落实的时候，但却未必。首先是不明白到底什么是「the right thing」，判断正确与否的标准是什么，其次是缺少足够的自制力。即使意识到正确的事情是什么，也无法坚持去做正确的事情。这一点很简单，因为正确的事情，往往短期没有效果，需要长期的坚持。而那些错误的事情，往往是短期有诱惑力的。&lt;/p&gt;
&lt;p&gt;回到「正确的事情」的标准上，这个其实有很多答案，因为有很多角度。今天，我们就来从「边际成本」的角度，来看看判断正确与否的标准是什么？在这个标准下，哪些事情是「正确的事情」。&lt;/p&gt;
&lt;p&gt;有关「边际效应」的定义，仅举一个例子，比如我们的工作是做棉被，做一床棉被，需要一个熟练工人，工作一整天（8小时）- 假设日工资100元，用去的棉花和其他物料成本价值200元。这样，一条棉被的成本就等于「工作8小时的价格：100元」+ 物料成本200元，总共是300元。某天，接受了一个大订单，需要做10床棉被，那么总成本就是300 x 10 = 3000，如果接受了一个更大的订单，需要做100床，那么总成本就是300 x 100 = 30000。&lt;/p&gt;
&lt;p&gt;在这个过程中，分摊到每条棉被身上的成本一直保持不变，这是很多传统企业的成本模式。但是，假设我们今天做的不是棉被，我们今天在网上录了一段课程，时长一小时，向外的售价为100元每人次。在这里，我们暂且忽略「推广成本」（即「获客成本」，其实真实世界中，这个是绝对不能忽略的，这个几乎就是互联网经济中最大的成本了，即流量获取成本，简称 TAC - Traffic Acquiring Cost），那么无论是一个人购买，还是1000人购买，我们的总的制作成本都是固定的，比如1000。那么很容易计算，当购买人数越多的时候，这个1000元的制作成本分摊到每个人身上的平均成本越来越低，直至趋近于0。这就是互联网经济的根本秘密，以相对固定的总成本，去服务越来越多的人，从而获得「边际成本递减」的效应。&lt;/p&gt;
&lt;p&gt;以这个标准来看，我们要尽可能用自己的时间去做那些能「边际成本递减」的事情，而不要做哪些「边际成本固定」甚至增加的事情。也就是说，不要拿自己固定的时间去换固定的钱，这个从长远来看是不划算的。因为你无法保证自己单位时间内的生产率一定会提高。&lt;/p&gt;
&lt;p&gt;而人生的真相就是，你会每天自然衰老。&lt;/p&gt;
&lt;p&gt;有哪些是「边际成本递减」的事情。&lt;/p&gt;
&lt;p&gt;其实这样的事情很多，看看周围有多少互联网公司，他们所从事的业务，每个典型的互联网业务都是「边际成本递减」的事情。如果不符合这个原则，别说做大上市，连最初VC 投资都很难拿到。这些业务包括电商、搜索、游戏平台、视频等等。虽然在现实世界中，这些业务的成本都和具体的服务人数有关，比如带宽流量等费用。但是总体来看，随着使用这些服务的人数增多，这些业务的边际成本是不断下降的。&lt;/p&gt;
&lt;p&gt;我从个人的角度据几个例子。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会员语音 - 现在提供语音服务的平台和个人越来越多，为什么这个形式越来越受欢迎，站在经济的角度，这是一个典型的有「边际效应」的事情。比如我每次准备和录制语音，大约需要花费4小时，按照我每小时价值1000元计算，成本是4000（不算电脑、录音设备等固定成本）。那么，当会员的人数是100人时，每个人身上的成本就是40元，当会员人数是1000时，每个人的成本是4元，当会员人数涨到4000的时候，每个人成本是1元。随着会员人数的增加，平均每会员的成本直线下降，而每个会员的会员费是固定的。这样人数越多，对我而言「越划算」。&lt;/li&gt;
&lt;li&gt;写作 - 作家在过去拿着微薄的收入，比如在微信盛行以前，博客还流行的时候，韩寒曾经说过，他是中国收入最高的作家，但是每年仅仅从写作上拿到200万的收入。这个地方的确得用「仅仅」，因为如果和日本，美国，欧洲等发达国家的畅销书作家相比，中国的作家的确太穷了。据报道，J.K.罗琳因为写《哈利·波特》获得的财富已超过10亿美元，个人资产超过英国女王。但是，随着社会对于版权的重视，也伴随着新的经济形态比如微信公众平台，得到等的诞生，情况正在发生巨大的改变。大家可能不知道，像咪蒙这样的微信平台红人，每篇软文的在去年的报价早已超过50万人民币！当然，即使忽略这样的个例，写作也越来越成为一个具有巨大边际效应的事情，无论你的读者是100还是10万，你写一篇文章的时间是固定的。但是10次阅读和1万次阅读背后的经济价值差的要比1000倍还大（假设是10%的阅读率）。另外，伴随着文章积累，你会出版书籍，获得更大的关注，除了读者直接带来的收益，还有商家的广告费，这都是会让你的边际成本加速递减，边际收入加速提高。所以，我很看好写作。这是一个「未来的生意」。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有哪些事情非「边际成本递减」&lt;/p&gt;
&lt;p&gt;边际成本固定甚至变大的事情更多，随便看到的例子几乎都是，比如很多朋友都有开一家咖啡馆，自己做老板，养花喂猫的「理想」。但是，开一家小店，恰恰是边际成本固定的例子。你需要这家店有多少产出，你就得投入多少时间和精力，甚至，也许因为选址不当或者定位偏差，你投入的更多精力未必能获得更多产出。&lt;/p&gt;
&lt;p&gt;当然，如果能从一家店走到连锁店（而非简单的两三家店），能做到中央厨房，供应链，IT 系统，培训体系的共享，就可以达到边际成本递减的效果。不过，这是「联锁」带来的结果，而不是一家咖啡店的必然结果。&lt;/p&gt;
&lt;p&gt;还有日复一日的重复性的工作，如果工作内容始终保持一样，你的技能也不会被动被提高。如果没有主动学习的意识，那么「重复工作」这件事情也是一个没有边际效应的事情。&lt;/p&gt;
&lt;p&gt;你想挣钱，就得去上班。你不上班，就不能挣到钱。你想挣更多的钱，就得更加努力。这看起来天经地义，但是其背后的问题就是没有边际效应。终有一天，你的体力和精力会走下坡路，那么你的收入也会随之下降。这是大多数人习以为常的生活。&lt;/p&gt;
&lt;p&gt;所以看起来，大家都习以为常的生活，其实有着巨大的陷阱。一方面你可以轻松的免于思考方向，看起来安全，放松，但却有着巨大的危机必然出现。我觉得人的大脑中有一种天生的「得过且过」的倾向，所以，「不见黄河不落泪」才成为大家的必然命运。&lt;/p&gt;
&lt;p&gt;总结一下：正确的事情就是「边际成本递减」的事情 - 这三年以来，我一直坚持去做的，都是有“边际效应”，也就是“边际成本递减”的事情。这些事情开始看起来傻，但是却有希望。一直尽力去少做的，就是“拿时间去换钱”的事情，这些事情开始看起来有诱惑，但却是越走越窄的路，越干越不划算的事情。&lt;/p&gt;
&lt;p&gt;我们的正确选择是首先选择一个「窄门」，然后走入一条看似崎岖，布满荆棘，没有太多光线的路，但是可以越走越宽，越走越光明。而不是像大家一样，跟着人流，走过一个很宽的门，一个看似很宽阔的康庄大道，然后越来越窄，越来越挤。等我们最终醒悟时，已经无法回头。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.douban.com/note/592733903/&quot;&gt;什么才是「正确的事情」？&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BB%80%E4%B9%88%E6%89%8D%E6%98%AF%E3%80%8C%E6%AD%A3%E7%A1%AE%E7%9A%84%E4%BA%8B%E6%83%85%E3%80%8D%EF%BC%9F.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BB%80%E4%B9%88%E6%89%8D%E6%98%AF%E3%80%8C%E6%AD%A3%E7%A1%AE%E7%9A%84%E4%BA%8B%E6%83%85%E3%80%8D%EF%BC%9F.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>如何评价韩剧《秘密森林》？</title>
            <description>
            &lt;!--
author: 真理的缝隙
date: 2019-08-10
title: 如何评价韩剧《秘密森林》？
tags: 韩剧
category: 转载
status: publish
summary: 什么是民主，什么是法治
--&gt;
&lt;h4&gt;如何评价韩剧《秘密森林》？&lt;/h4&gt;
&lt;p&gt;《秘密森林》：法治不足以自足&lt;/p&gt;
&lt;p&gt;对民主化理论研究多年的Linz和Stepan在其经典著作《民主转型与巩固的问题》中，强调了民主巩固需要五个场域的条件：活跃的公民社会，制度化的政治社会，法治资源，可资利用的官僚系统，健全的经济社会。&lt;/p&gt;
&lt;p&gt;许多人认为至关重要的法治，仅仅是五个场域中的一个。近年来，有许多观念认为法治是民主化的前提，而实现法治，理想的治理模式就可以形成。这句话是有合理性的，法治是民主化的必要条件，也是有效的政府治理的必要条件。然而，法治却难以真正自足。&lt;/p&gt;
&lt;p&gt;在这里，姑且不讨论规范层面上，法律的基础和“何为正当法律”的问题。仅仅从实证角度考量，任何一种司法制度的安排必须附着于相应的政治制度，而从新制度主义兴起以来，制度就不再仅仅是白纸黑字的条文，而是人们彼此认可的规范，是一套社会运行的机制和结构。&lt;/p&gt;
&lt;p&gt;正如《秘密森林》剧中显示，法治并不仅仅是有了一部宪法，规定了一系列条文就足够的。为了管理，司法系统内自然也有等级差别，于是，检察长就可以庇护犯罪，总统首席秘书官可以施压撤销独立的检查组。由于司法系统也是由人所组成，利益集团的渗透也变得不可避免，在韩国地位独特的财阀于是捕获了司法系统，李昌俊这样的杰出检察官也不得不为他们撑起保护伞。&lt;/p&gt;
&lt;p&gt;难道没有法律规定检察官的公正和独立吗？难道没有详细的法律制度规定检察院的调查准则么？可是法治慢慢地崩溃了，经济犯罪甚至扩大到了直接危害民众安全的刑事犯罪。&lt;/p&gt;
&lt;p&gt;我们可以找出那些法治失败的理由。比如说，朴庆莞被刑讯逼供无法伸冤，甚至被警察局反咬一口，可为什么不规定审讯全过程影像化呢？如果有这样的规定，为什么不能落实呢？为什么在刑讯逼供的相关审讯中，举证责任不能倒置呢？&lt;/p&gt;
&lt;p&gt;特检组可以被检察总长解散，可为什么不能有独立的检查组来处理腐败问题呢？为什么司法机构本应独立，行政分支却可以肆意干预特检组的存废？&lt;/p&gt;
&lt;p&gt;这些安排全都不仅是法律安排，也不是在法治逻辑中得到自足的问题。本质上，这些都是政治性的安排，需要通过政治社会的讨论和共识来完成。&lt;/p&gt;
&lt;p&gt;朴庆莞的刑讯事件是如何被翻出来的？是因为有金政本这样的人权律师，是因为有以人权为主题的NGO，是因为有强大且关心民权议题的公民社会。&lt;/p&gt;
&lt;p&gt;对韩朝集团的调查是如何进行下去而无法被中途终止的？是因为由国会的在野党盯着青瓦台，是因为有活跃的媒体（广义上也属于公民社会的一部分）起到多元化的作用，是因为民众可以采用政治行动来对抗少数权贵对司法系统的颠覆。&lt;/p&gt;
&lt;p&gt;法治确实是个好东西，但法治不会是天上掉下来的东西。没有健全的公民社会多元化的利益格局和组织行动能力，没有多元化的媒体进行不断监督，检察院和龙山警署本已同流合污准备把金佳英案做成铁案。司法公正不能靠“检察官的良心”，真实世界里没有黄时木，但可能有许许多多有些软弱但也没有彻底堕落的姜元哲。“因为可以，所以才做”，“只要有一个人阻止，就不会发生”。活跃的公民社会，总会有一个人站出来说出真相。有这样的公民社会来做监督，有些事情就会变得从一开始就绝不可以。&lt;/p&gt;
&lt;p&gt;法治也是会受到腐蚀的。它需要精妙的政治安排来分割权力，保持公正。当司法系统被腐蚀后，它也需要一个健全的政治社会来为它做扳道工，让它能够回到正轨。对于蒙冤的人，对于内部权钱交易的腐败，除了司法途径，民众还可以选择强大的公民组织，也还可以为自己的选区选择另一个代表。可以游说自己的议员，也可以通过政党表达改革的政治诉求。&lt;/p&gt;
&lt;p&gt;所以，《秘密森林》既不是在告诉人们天下乌鸦一般黑，也不是在揭示什么司法永远不可能公正的普遍真相。如果说秘密森林揭示了什么，那就是法治是一朵娇嫩的花朵，需要一直被人们关心呵护。如果说秘密森林启示了什么，那就是一味地等着做公正的法治下的顺民是不可能的。公民社会和政治社会都应当是活跃的，权力属于民众，司法的公正也需要以此被捍卫。&lt;/p&gt;
&lt;p&gt;黄时木最后说，“检察官是人民的检察官”。此话不假，但唯一能让此话成真的办法，是如果检察官背叛了人民，人民会知道这一点，然后让他当不成检察官。金局长为他作为龙山署长的所作所为在法庭上道歉，而让警察不必为此蒙羞的办法，则是持续不断地增强透明度——这一点，依然不能仅仅靠政府完成。没有选票的激励，政府也未必主动完成。&lt;/p&gt;
&lt;p&gt;李昌俊说的不错，也许法治正在崩溃，体系正在腐烂。但解决的办法不是一个悲剧英雄式的理想主义者的临死一击，而是现实的韩国民众所展示的道路。你想黑，就有公民社会的团体曝光你。你在社会中因为不平等而吃了亏，你可以向NGO寻求帮助。司法系统腐败了，那就用舆论斗阵甚至街头运动的形式迫使公正的调查能够继续。总统要阻止就投票给另一个党，总统要包庇就弹劾总统。就像朴槿惠所遭遇的一样，就像新世界党所遭遇的一样。&lt;/p&gt;
&lt;p&gt;保守派政府被期望着带来秩序、稳定和经济发展，但如果他们制造了腐败、不公正和财阀权贵政治，那就选择共同民主党，那就选择文在寅，甚至选择更加激进的李在明。想要改变，就要行动。而民众行动依赖的途径，不是寄希望于理想的检察官，不是寄希望于良知未泯的人。这些人很重要，但他们不是最后一层防火墙。最后一层防火墙是韩国公民手中的选票，是活跃的媒体，是有行动力的公民组织，是发育良好的公民社会和政治社会。&lt;/p&gt;
&lt;p&gt;法治是不能够自足的。低质量的民主也许也没有法治，但没有民主却有理想法治，只不过是许多人的一个美梦罢了。真实世界中，能阻止李允范，抓捕龙山署长的，不是李昌俊的殊死一搏，不是黄时木的机智冷静。而是要求朴槿惠下台的十多次烛光晚会，是投给文在寅的一千三百万张选票。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;作者：真理的缝隙&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.zhihu.com/question/61004305/answer/229075552&quot;&gt;如何评价韩剧《秘密森林》？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;来源：知乎&lt;/p&gt;
&lt;p&gt;著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%A6%82%E4%BD%95%E8%AF%84%E4%BB%B7%E9%9F%A9%E5%89%A7%E3%80%8A%E7%A7%98%E5%AF%86%E6%A3%AE%E6%9E%97%E3%80%8B%EF%BC%9F.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%A6%82%E4%BD%95%E8%AF%84%E4%BB%B7%E9%9F%A9%E5%89%A7%E3%80%8A%E7%A7%98%E5%AF%86%E6%A3%AE%E6%9E%97%E3%80%8B%EF%BC%9F.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>Ubuntu 18.04 安装微擎框架</title>
            <description>
            &lt;!--
author: admin
date: 2019-08-10
title: Ubuntu 18.04 安装微擎框架
tags: Ubuntu
category: PHP
status: publish
summary: 之前的细节参考前几篇文章，这里不再重复
--&gt;
&lt;h4&gt;Ubuntu 18.04 安装微擎框架&lt;/h4&gt;
&lt;h5&gt;针对微擎的PHP环境要求&lt;/h5&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;选项&lt;/th&gt;
&lt;th&gt;要求&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP版本&lt;/td&gt;
&lt;td&gt;5.3或以上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cURL&lt;/td&gt;
&lt;td&gt;enable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDO&lt;/td&gt;
&lt;td&gt;enable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;openssl&lt;/td&gt;
&lt;td&gt;enable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GD2&lt;/td&gt;
&lt;td&gt;enable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOM&lt;/td&gt;
&lt;td&gt;enable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;session.auto_start&lt;/td&gt;
&lt;td&gt;disable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;asp_tags&lt;/td&gt;
&lt;td&gt;disable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;查找软件包&lt;/p&gt;
&lt;p&gt;&lt;code&gt;apt-cache search &amp;lt;你要查找的软件包&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;启用&lt;code&gt;cURL&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;apt-get update
apt-cache search php7.2-curl
# result
# php7.2-curl - CURL module for PHP
apt-get install php7.2-curl -y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ensure the path in &lt;code&gt;extension_dir&lt;/code&gt; exists, and contains &lt;code&gt;curl.so&lt;/code&gt;, if not, change to the correct path.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;php -i | grep extension_dir
# result
# extension_dir =&amp;gt; /usr/lib/php/20170718 =&amp;gt; /usr/lib/php/20170718
cd /usr/lib/php/20170718 &amp;amp;&amp;amp; ls
# ... calendar.so  curl.so  fileinfo.so ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ensure the &lt;code&gt;/etc/php/7.2/mods-available/curl.ini&lt;/code&gt; exists and has the curl.so loaded&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;; configuration for php curl module
; priority=20
extension=curl.so&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If everything is correct, restart &lt;code&gt;PHP-FPM&lt;/code&gt;
&lt;code&gt;/etc/init.d/php7.2-fpm restart&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;剩下的扩展&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;apt-cache search php7.2-gd php7.2-xml
# php7.2-gd - GD module for PHP
apt-cache search php7.2-xml
# php7.2-xml - DOM, SimpleXML, WDDX, XML, and XSL module for PHP
# php7.2-xmlrpc - XMLRPC-EPI module for PHP
apt-get install php7.2-gd php7.2-xml -y
/etc/init.d/php7.2-fpm restart&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目录权限&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 假设运行微擎的用户是 www 网站目录为 /www/wwwroot/we7,请根据实际情况修改
chown -R www:www /www/wwwroot/we7
chmod -R 744 /www/wwwroot/we7&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/23233460/how-do-i-enable-curl-for-php&quot;&gt;How do I enable curl for php&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Ubuntu_18.04_%E5%AE%89%E8%A3%85%E5%BE%AE%E6%93%8E%E6%A1%86%E6%9E%B6.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Ubuntu_18.04_%E5%AE%89%E8%A3%85%E5%BE%AE%E6%93%8E%E6%A1%86%E6%9E%B6.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>MySQL TIMESTAMP 字段</title>
            <description>
            &lt;!--
author: admin
date: 2019-08-10
title: MySQL TIMESTAMP 字段
tags: MySQL
category: PHP
status: publish
summary: 使用CodeIgniter测试下
--&gt;
&lt;h4&gt;MySQL TIMESTAMP 字段&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;mysql&lt;/code&gt; 建立字段的时候 &lt;code&gt;time&lt;/code&gt; 选择 &lt;code&gt;TIMESTAMP&lt;/code&gt; 后 ，&lt;code&gt;PHP&lt;/code&gt; 如果传递正确的时间数据呢？&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mysql&lt;/code&gt; 的 &lt;code&gt;TIMESTAMP&lt;/code&gt; 到底是什么性质的呢？&lt;/p&gt;
&lt;p&gt;要搞清楚
使用 &lt;code&gt;PHP&lt;/code&gt; 从数据库中取出的时间的数据类型
使用 &lt;code&gt;PHP&lt;/code&gt; 向数据库中插入的时间的数据类型&lt;/p&gt;
&lt;p&gt;测试环境：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Windows 2016 LTS
Apache 2.4.23
OpenSSL 1.0.2j
Mod_fcgid 2.3.9
PHP 7.0.12
MySQL 5.5.53
CodeIgniter 3.1.10&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置CI中的数据库&lt;code&gt;application/config/database.php&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;创建Model（模型）&lt;/h4&gt;
&lt;p&gt;连接数据库&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
defined(&#039;BASEPATH&#039;) OR exit(&#039;No direct script access allowed&#039;);

class Time_test extends CI_Model {

    public function __construct()
    {
        $this-&amp;gt;load-&amp;gt;database();
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;确定PHP时间函数的数据类型&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function times()
    {

        $t = time();

        var_dump($t);die;

    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;int(1554692204) &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.mysqltutorial.org/mysql-timestamp.aspx&quot;&gt;Understanding MySQL TIMESTAMP&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;INSERT INTO time_test (time) VALUES (&#039;1554692204&#039;);
INSERT INTO time_test (time) VALUES (&#039;2019-04-08 11:16:23&#039;);&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM time_test;
+----+---------------------+
| id | time                |
+----+---------------------+
|  1 | 0000-00-00 00:00:00 |
|  2 | 2019-04-08 11:16:23 |
+----+---------------------+
2 rows in set (0.00 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MySQL 的 timestamp 接受 &lt;code&gt;2019-04-08 11:16:23&lt;/code&gt; 这种格式的时间输入&lt;/p&gt;
&lt;h4&gt;从数据库中取出时间数据，并查看数据类型&lt;/h4&gt;
&lt;h5&gt;模型（数据库）&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function time_view()
    {
        $query = $this-&amp;gt;db-&amp;gt;get(&#039;time_test&#039;)-&amp;gt;result();
        return $query;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;控制器&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function times()
    {

        $result[&#039;results&#039;] = $this-&amp;gt;time_test-&amp;gt;time_view();
        var_dump($result);

    }&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;结果&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;array(1) {
  [&quot;results&quot;]=&amp;gt;
  array(2) {
    [0]=&amp;gt;
    object(stdClass)#20 (2) {
      [&quot;id&quot;]=&amp;gt;
      string(1) &quot;5&quot;
      [&quot;time&quot;]=&amp;gt;
      string(19) &quot;0000-00-00 00:00:00&quot;
    }
    [1]=&amp;gt;
    object(stdClass)#21 (2) {
      [&quot;id&quot;]=&amp;gt;
      string(1) &quot;6&quot;
      [&quot;time&quot;]=&amp;gt;
      string(19) &quot;2019-04-08 11:16:23&quot;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;总结&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;MySQL TIMESTAMP&lt;/code&gt; 类型的时间在&lt;code&gt;PHP&lt;/code&gt;中是以&lt;code&gt;string&lt;/code&gt;的形式返回的
输入输出都是&lt;code&gt;2019-04-08 11:16:23&lt;/code&gt;这种格式&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PHP&lt;/code&gt;中的&lt;code&gt;time()&lt;/code&gt;函数则是&lt;code&gt;int&lt;/code&gt;类型的数据 &lt;code&gt;int(1554692204)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;剩下的就是两者之间的转换了&lt;/p&gt;
&lt;h5&gt;&lt;code&gt;PHP time() ---&amp;gt; MySQL timestamp&lt;/code&gt;&lt;/h5&gt;
&lt;h5&gt;数据库（模型）&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function time_insert($data)
    {
        $this-&amp;gt;db-&amp;gt;insert(&#039;time_test&#039;, $data);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;控制器&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function insert_time()
    {
        $t = time();
        $tt = date(&quot;Y-m-d H:i:s&quot;,$t);
        $data = array(
            &#039;time&#039; =&amp;gt; $tt
        );

        $this-&amp;gt;time_test-&amp;gt;time_insert($data);

    }&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;结果&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM time_test;
+----+---------------------+
| id | time                |
+----+---------------------+
|  5 | 0000-00-00 00:00:00 |
|  6 | 2019-04-08 11:16:23 |
|  7 | 2019-04-08 21:32:17 |
+----+---------------------+
3 rows in set (0.00 sec)&lt;/code&gt;&lt;/pre&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/MySQL_TIMESTAMP_%E5%AD%97%E6%AE%B5.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/MySQL_TIMESTAMP_%E5%AD%97%E6%AE%B5.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>CodeIgniter  操作数据库</title>
            <description>
            &lt;!--
author: Laker Huang
date: 2019-08-10
title: CodeIgniter  操作数据库
tags: CodeIgniter
category: PHP
status: publish
summary: 算是总结吧
--&gt;
&lt;h4&gt;CodeIgniter  操作数据库&lt;/h4&gt;
&lt;p&gt;涉及到数据库，就是比较复杂的内容了，所以本文略长，但是CI还是为我们省了很多麻烦事。CI提供了强大的数据库函数类——Active Record，源码是&lt;code&gt;/system/database/DB_active_rec.php&lt;/code&gt;文件。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;#使用
$this -&amp;gt; db -&amp;gt; 方法名()

#连接数据库
$this -&amp;gt; db -&amp;gt; 方法名();

#插入
$this -&amp;gt; db -&amp;gt; insert(表名, 数据);

#更新
$this -&amp;gt; db -&amp;gt; where(字段名, 字段值);
$this -&amp;gt; db -&amp;gt; update(表名, 修改值的数组);

#查找
$this -&amp;gt; db -&amp;gt; where(字段名, 字段值);
$this -&amp;gt; db -&amp;gt; select(查找的字段名);
$query = $this -&amp;gt; db -&amp;gt; get(表名);
return $query -&amp;gt; result();

#删除
$this -&amp;gt; db -&amp;gt; where(字段名, 字段值);
$this -&amp;gt; db -&amp;gt; delete(表名);&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://laker.me/blog/2014/02/02/14_0202_aomine_CI_3_database/&quot;&gt;跟着阿大学CodeIgniter （三）—— 操作数据库&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/CodeIgniter_%E6%93%8D%E4%BD%9C%E6%95%B0%E6%8D%AE%E5%BA%93.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/CodeIgniter_%E6%93%8D%E4%BD%9C%E6%95%B0%E6%8D%AE%E5%BA%93.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>波伏娃说「女人的不幸则在于被几乎不可抗拒的诱惑包围着」中的不可抗拒的诱惑指什么？</title>
            <description>
            &lt;!--
author: 菠菜 微信号：有点自卑（bocai_zhu）
date: 2019-08-09
title: 波伏娃说「女人的不幸则在于被几乎不可抗拒的诱惑包围着」中的不可抗拒的诱惑指什么？
tags: 努力,抱怨,思考
category: 转载
status: publish
summary: 这个世界其实一点也不友善
--&gt;
&lt;h4&gt;波伏娃说「女人的不幸则在于被几乎不可抗拒的诱惑包围着」中的不可抗拒的诱惑指什么？&lt;/h4&gt;
&lt;p&gt;问：&lt;/p&gt;
&lt;p&gt;波伏娃说：男人的极大幸运在于，他不论在成年还是在小时候，必须踏上一条极为艰苦的道路，不过这是一条最可靠的道路；女人的不幸则在于被几乎不可抗拒的诱惑包围着；她不被要求奋发向上，只被鼓励滑下去到达极乐。当她发觉自己被海市蜃楼愚弄时，已经为时太晚，她的力量在失败的冒险中已被耗尽。&lt;/p&gt;
&lt;p&gt;女人受到的诱惑到底指什么呢？我的理解是男人也受到极大的诱惑，不是只有女人受到极大的诱惑。或者有哪位女性朋友可以说说具体的生活中曾经或者正在受到的诱惑？&lt;/p&gt;
&lt;p&gt;答：&lt;/p&gt;
&lt;p&gt;无需战斗，不用丑陋的诱惑。&lt;/p&gt;
&lt;p&gt;哪怕是姿色平平的女人，都会被这个童话诱惑。就是只要没什么野心，心地善良，与世无争，就可以获得一份平平淡淡的生活。&lt;/p&gt;
&lt;p&gt;仿佛享受平淡生活这个事情，对于女人来说，简单的不值一提。&lt;/p&gt;
&lt;p&gt;如果一个男人从小就觉得，我不会和任何人争，我只要善良，简单，老天自然会嘉奖我一份平淡生活，那旁边的人就会告诉他你会被这个社会吃的渣都不剩，但是到女人这里，这种思维模式就被大加赞赏。&lt;/p&gt;
&lt;p&gt;青春期的女孩子，默认是纯真的，被保护的，其他人，都是大灰狼。&lt;/p&gt;
&lt;p&gt;致命的诱惑不是来自于大灰狼，致命的诱惑是女人不用去做大灰狼，还能活的比大灰狼心满意足。这事太扯了，似乎大灰狼满足自己反而很痛苦，小绵羊不满足自己，只是被大灰狼或者小公羊满足就会变得很幸福。&lt;/p&gt;
&lt;p&gt;不用满足欲望，也可以幸福的傻白甜洗脑，才是无孔不入的诱惑。&lt;/p&gt;
&lt;p&gt;摒弃自身的欲望获得生命的大和谐，这条悟道之路是多么的艰难，不是天生性别女，就每个人都可以轻轻松松做到了。大部分红尘儿女，谁都逃不掉为了欲望去争夺，嫉妒，痛苦。&lt;/p&gt;
&lt;p&gt;既然争夺，嫉妒，痛苦逃不掉，当日是越年轻，越身强力壮的时候去经历，去失败，去反省才对。赚自己想要的钱，追自己想要的男人，说自己想说的话，打自己想打的人，去品尝成功的快乐，去咀嚼失败的耻辱——女人也可以犯错误，可以为色，为财，为虚荣心，为权力欲去犯各种各样愚蠢的错误，变得丑陋，有些人洗的白，有些人洗不白，追求欲望是很危险的，但是生活的危险，你不找它，他也会来找你。&lt;/p&gt;
&lt;p&gt;那些杀不死你的，就会让你更加强大。&lt;/p&gt;
&lt;p&gt;我重复一遍，那些杀不死你但是能搞脏女人的丑陋，就和那些杀不死男人但搞脏男人的丑陋一样，可以让人更强大。&lt;/p&gt;
&lt;p&gt;看不得女人被搞脏，告诉女人你们只要乖巧安分就不会被搞脏，这才是需要戳破的诱惑果实。&lt;/p&gt;
&lt;p&gt;经历了彼此都脏兮兮的战斗还有什么好处？是学会认输，不是被动认输，是主动认输。许多女人从来没有经历过主动认输的屈辱，我不行了，我输了，我得不到，我先撤了，这也是坦坦荡荡的人性必经之路。只有学会如何培养主动结束战斗的勇气，敢于结束，才会在下一次敢于开始。&lt;/p&gt;
&lt;p&gt;不敢结束，当然就不会开始。当知道这场战斗快输了的时候，放弃了最佳认输时间，白白消耗到最后一秒，从此丧失了再次开始的勇气，这是许多中年女性追求平淡生活而不得的写照。&lt;/p&gt;
&lt;p&gt;生活就像考试一样，普通人尽自己最大努力，有可能也就是及格或者中游，如果只按照60分的考纲复习，那是会不及格的。&lt;/p&gt;
&lt;p&gt;好好学习好好工作就可以经济独立了么？你还要学会怎么获得老板信任哪怕是拍马屁，说出自己的业绩哪怕有吹牛逼。&lt;/p&gt;
&lt;p&gt;丈夫出轨自己马上离婚带个孩子就可以了么？你还要学会怎么迅速转移家庭财产，要孩子抢孩子，各种利益先下手为强，嘴上都是主义，心里要有生意。&lt;/p&gt;
&lt;p&gt;礼貌待人，亲切友好就有好人缘么？与人为善的同时，也要学会谁先背叛，那么我就以牙还牙的冷酷和愤怒。&lt;/p&gt;
&lt;p&gt;不要过早相信自己可以过上平平淡淡的生活，女人和男人一样，年轻时候太过松懈，那么离悲惨也就一步之遥。不怕脏不怕累啊，既然男人成长路上可能会被人利用，会吃亏，被迷茫，会痛苦，女人成长路上被人利用，吃亏，迷茫，痛苦也没啥过不去的——承认失败，然后接受下一次挑战。打仗么，借助知识，也借助兽性，利用恐惧，也利用虚荣，一次次地和欲望对扇耳光，然后才能不惧长大，不惧皮囊美丑，变成一个经验丰富的老兵。&lt;/p&gt;
&lt;p&gt;然后才有安心享受战斗间隙的平淡生活。&lt;/p&gt;
&lt;p&gt;有战斗才有平淡，妄图永远逃避战斗的，心里很容易被麻木和恐惧占领，就是我们说的，没有安全感——只能在一场场战斗里选择失败的屈辱，和胜利的安全感，只能在一场场战斗的间隙喘口平淡的气，这宿命谁也逃不掉，性别男逃不掉，性别女也一样滴。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;来源：&lt;a href=&quot;https://www.zhihu.com/question/51644796&quot;&gt;https://www.zhihu.com/question/51644796&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E6%B3%A2%E4%BC%8F%E5%A8%83%E8%AF%B4%E3%80%8C%E5%A5%B3%E4%BA%BA%E7%9A%84%E4%B8%8D%E5%B9%B8%E5%88%99%E5%9C%A8%E4%BA%8E%E8%A2%AB%E5%87%A0%E4%B9%8E%E4%B8%8D%E5%8F%AF%E6%8A%97%E6%8B%92%E7%9A%84%E8%AF%B1%E6%83%91%E5%8C%85%E5%9B%B4%E7%9D%80%E3%80%8D%E4%B8%AD%E7%9A%84%E4%B8%8D%E5%8F%AF%E6%8A%97%E6%8B%92%E7%9A%84%E8%AF%B1%E6%83%91%E6%8C%87%E4%BB%80%E4%B9%88%EF%BC%9F.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E6%B3%A2%E4%BC%8F%E5%A8%83%E8%AF%B4%E3%80%8C%E5%A5%B3%E4%BA%BA%E7%9A%84%E4%B8%8D%E5%B9%B8%E5%88%99%E5%9C%A8%E4%BA%8E%E8%A2%AB%E5%87%A0%E4%B9%8E%E4%B8%8D%E5%8F%AF%E6%8A%97%E6%8B%92%E7%9A%84%E8%AF%B1%E6%83%91%E5%8C%85%E5%9B%B4%E7%9D%80%E3%80%8D%E4%B8%AD%E7%9A%84%E4%B8%8D%E5%8F%AF%E6%8A%97%E6%8B%92%E7%9A%84%E8%AF%B1%E6%83%91%E6%8C%87%E4%BB%80%E4%B9%88%EF%BC%9F.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>人不值得考验</title>
            <description>
            &lt;!--
author: ho Ec
date: 2019-08-09
title: 人不值得考验
tags: 人性,思考
category: 转载
status: publish
summary: AV也可以拍得如此深刻
--&gt;
&lt;h4&gt;人不值得考验&lt;/h4&gt;
&lt;p&gt;我们先来假设一个场景：&lt;/p&gt;
&lt;p&gt;你和你的另一半，是人人欣羡的鸳鸯眷侣，恋爱多年，打算周末去民政局领证。&lt;/p&gt;
&lt;p&gt;在领证前，有人偷偷告诉你，他有办法来测试你的另一半是否忠贞。&lt;/p&gt;
&lt;p&gt;情侣间难免会有类似“考验伴侣”的想法，但大都不会付诸实施。两个人磕磕碰碰、循环往复，一辈子也就过去了。满分5星，给对方3星好评不成问题。&lt;/p&gt;
&lt;p&gt;但你若发现，真的有一种测试，可以在结婚前窥探另一半的忠诚度，来确认他是否死心塌地、用情专一，你会动心吗？&lt;/p&gt;
&lt;p&gt;在一部AV里，人们给出了答案。&lt;/p&gt;
&lt;p&gt;AV情节很简单：工作人员随机选择一些热恋期的情侣，邀请他们参加访谈。&lt;/p&gt;
&lt;p&gt;访谈的内容多是些恋爱几年、感情如何的提问，情侣们纷纷表示对方就是自己认定的意中人，绝无反悔。&lt;/p&gt;
&lt;p&gt;工作人员随后借故将男方调离采访室，带入一单独房间。等待片刻，一陌生女子进入房间，对其百般挑逗，并一再保证事情不会败露，天知地知你知我知。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1556895076569.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;绝大多数人在短时间内均告沦陷，而10分钟前，他们还亲口表示过对另一半的矢志不渝。&lt;/p&gt;
&lt;p&gt;这些人没有想到，女友就在一层单面透光玻璃后注视着自己。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1556895092537.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;单面透光玻璃，里面看不见外面&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不出意外，遭此一劫，即便三年、五年经营起的感情，也足以分崩离析。&lt;/p&gt;
&lt;p&gt;举这个例子，是想说明天底下的男人都是花心大萝卜？&lt;/p&gt;
&lt;p&gt;不是这样的。作为回敬，这家AV公司又出了影片续集，把男女主角对调，女方无一例外走了男方的老路，退化成用下半身思考的动物。&lt;/p&gt;
&lt;p&gt;当然，你可以说AV都有表演夸大的成分，但其探讨的问题，却真实存在于生活中。&lt;/p&gt;
&lt;p&gt;今年5月，美国男子Jonathan用了近乎相同的办法来考验女友，在某网络节目的帮助下，派出高大帅气的男模与女友搭讪，互留电话号码，女友沦陷；&lt;/p&gt;
&lt;p&gt;英国《Daily Mail》也报道过类似事件：伯明翰一女子假装落水，以此来测试不会游泳的男友是否会舍命跳入水中救她。男友迅速拨打报警电话并折断树枝让女友抓住，但并未跳入水中。女友不满，二人分手。&lt;/p&gt;
&lt;p&gt;除去考验爱情忠贞之外，人们同样热衷于考验在日常生活中被压抑的人性——&lt;/p&gt;
&lt;p&gt;在小孩子饥饿时给他一块面包，看他是否会将面包分给一旁同样饥饿的玩伴。不分，就是自私。&lt;/p&gt;
&lt;p&gt;在闹市区安排一个小女孩缩在墙角，做楚楚可怜状。所有熟视无睹的路人，都被扣上“冷漠”的帽子。&lt;/p&gt;
&lt;p&gt;在路边故意放一张百元钞票，捡起揣进自己口袋的人，难免被看作“贪得无厌”。&lt;/p&gt;
&lt;p&gt;此类测试噱头十足，放到网上总能引起轩然大波，网民痛斥这些在实验里中了招的当事人卑鄙邪恶，纷纷发誓自己绝不会犯同样错误。&lt;/p&gt;
&lt;p&gt;但很可惜，网民们连赌咒发誓的资格都没有。&lt;strong&gt;因为人性，早已以遗传的形式烙刻于人类的基因中，你、我，所有人，无一例外。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;人性有积极的一面：爱、同情、勇敢、善良；也不乏阴暗特质：自私、妒忌、多疑、贪婪。&lt;/p&gt;
&lt;p&gt;两者相加，才是人性的完全体。&lt;/p&gt;
&lt;p&gt;我们有“道德”，它强迫人们去展现积极、抹杀阴暗。但阴暗只能被抑制，绝无根除的可能，你不可能根除一个与生俱来的东西。&lt;/p&gt;
&lt;p&gt;而诸多所谓的人性测试，如同给予阴暗面一次开闸泄洪的机会，怂恿心底的恶冲破善的枷锁。除了给被试者带来痛苦之外，证明不了任何事情。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;考验人性，不仅无用，而且愚蠢。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;人性向来复杂，绝不止于黑白。&lt;/p&gt;
&lt;p&gt;环境会影响一个人的决策，将文弱书生转变为十恶不赦的监狱牢头。是的，我说的是路西法效应。&lt;/p&gt;
&lt;p&gt;身边的观点会影响一个人的诚实，将显而易见的事实描述成谎言。是的，我说的是从众心理。&lt;/p&gt;
&lt;p&gt;群众会影响一个人的善良，让其在有能力对危难者施救的情况下，选择冷漠观望。是的，我说的是旁观者效应。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这些行为都能从心理学角度来解释，绝非一句轻飘飘的“烂人”、“渣滓”可以妄下定论。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;除去训练有素的心理研究人员外，任何自作聪明的、关于考验人性的测试，任何根据所谓的测试结果进行的论断，都有可能伤敌一千，自损八百。&lt;/p&gt;
&lt;p&gt;人性经不起考验，人性也不该用来考验。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我们学习、工作、读书、完善自我，不是为了今后能在人性的考场中做出正确的抉择，而是为了终其一生，也不用踏入这样的考场。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;远离贫穷，就无需在食不果腹时，望着路人的钱包，挣扎于生存与偷窃之间；&lt;/p&gt;
&lt;p&gt;远离疾病，就无需体会奄奄一息时，在高昂的医药费和亲朋好友间冷漠的面孔下艰难度日的感觉。&lt;/p&gt;
&lt;p&gt;远离精心设计的人性陷阱，就无需经受让一个饿极之人看守一盘包子时的内心挣扎与冲突。&lt;/p&gt;
&lt;p&gt;因此在文章最后，我要再问你一遍开头提到的AV电影中的桥段：&lt;/p&gt;
&lt;p&gt;如果有人告诉你，他有办法来测试你的另一半是否忠贞，你会答应吗？&lt;/p&gt;
&lt;p&gt;不出意外，还是会有人应允，因为对未知的恐惧与好奇，同样也是人性的一部分。&lt;/p&gt;
&lt;p&gt;只是在测试开始之前，请做好爱情的巨轮土崩瓦解的准备。测试结束后，也不要哭哭啼啼，说些“我看走眼了”之类的鬼话。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;因为你要记得，在此次闹剧中，最先违背情侣之间信任的基石，为了考验所谓的忠心而使用欺骗手段的人，不是他，是你。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;https://zhuanlan.zhihu.com/p/21857272&quot;&gt;https://zhuanlan.zhihu.com/p/21857272&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BA%BA%E4%B8%8D%E5%80%BC%E5%BE%97%E8%80%83%E9%AA%8C.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BA%BA%E4%B8%8D%E5%80%BC%E5%BE%97%E8%80%83%E9%AA%8C.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>《秘密森林》</title>
            <description>
            &lt;!--
author: admin
date: 2019-07-13
title: 《秘密森林》
tags: 韩剧
category: 碎碎念
status: publish
summary: 一点观后感想罢了
--&gt;
&lt;h4&gt;《秘密森林》&lt;/h4&gt;
&lt;p&gt;花了3天时间看完了。果然是一部可以媲美《信号》的韩剧。&lt;/p&gt;
&lt;p&gt;也算是看过几部韩国的刑侦剧了，有一点个人的小感想，韩国刑侦剧着重点在于正义，什么是正义，如何捍卫正义，而日本的刑侦剧则更关注于嫌疑人，嫌疑人的经历，为什么会犯罪，比如《嫌犯X的献身》。当然这只是我个人看了一些韩剧和日剧的一点点感触罢了。&lt;/p&gt;
&lt;p&gt;之前在知乎上看到过，韩国的民主化进程是流血的进程。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1953年朝鲜战争结束后，韩国开启个人独裁统治&lt;/p&gt;
&lt;p&gt;李承晚&lt;/p&gt;
&lt;p&gt;朴正熙(朴槿惠之父)&lt;/p&gt;
&lt;p&gt;全斗焕&lt;/p&gt;
&lt;p&gt;1980年光州民主化运动&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以韩国民众对正义，对民主有着无比的渴求，对政治有一种天然的不信任。
而日本，或许是当前整个社会沉闷，无力，所以才会格外的关注人的心理，人的遭遇，没有人愿意犯罪啊，没有人愿意拿着刀对准别人的胸口刺下去啊&lt;/p&gt;
&lt;p&gt;“武侠是成人的童话。”&lt;/p&gt;
&lt;p&gt;我倒是觉得，偏向写实的影视剧也是成人的童话。&lt;/p&gt;
&lt;p&gt;在我看过的大部分电视剧电影中，主角一般都是孤身一人，对抗着一切。这不是成人心中的那个英雄梦吗？&lt;/p&gt;
&lt;p&gt;本故事纯属虚构，是的，这是整部剧中唯一一句真话了。在现实生活中，有多少孤身英雄呢？他们能力出众，坚持自我，有着最正确的三观，在抗争的道路上只会留下背影。《秘密森林》也好，《信号》也好，《铁证悬案～真相之门～》也好，“加贺恭一郎系列”也好。&lt;/p&gt;
&lt;p&gt;因为作者知道，如果不是孤身一人，主角将深陷生活的泥潭，柴米油盐，父母爱人孩子，有太多的牵绊，力量被分散了，又怎样能使出奋力的一击呢？&lt;/p&gt;
&lt;p&gt;回到剧中，黄始木检察官如果不是接受脑部手术失去情感之后，他能否依然坚持自我，独守清流呢？他是否会和李彰俊检察长一样，一步步妥协，又或者像永长官一样为了保护家人，选择沉默呢？&lt;/p&gt;
&lt;p&gt;除了男女主角，那些最终没有坚持住的人才是我们真正的身影。可能我们期待着孤独的英雄啊，来拯救我们吧，因为唯有他们不需要被感情，被利益要挟着选择。&lt;/p&gt;
&lt;p&gt;原来，从童话中醒来的我们，无非又进入了一个有着英雄的美梦啊。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E3%80%8A%E7%A7%98%E5%AF%86%E6%A3%AE%E6%9E%97%E3%80%8B.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E3%80%8A%E7%A7%98%E5%AF%86%E6%A3%AE%E6%9E%97%E3%80%8B.html</guid>
                                               <category>碎碎念</category>
                                    </item>
                <item>
            <title>为斐讯K2P编译OpenWRT固件</title>
            <description>
            &lt;!--
author: admin
date: 2019-07-10
title: 为斐讯K2P编译OpenWRT固件
tags: OpenWRT,编译
category: Linux
status: publish
summary: 在闲鱼上收了一个K2P,但是苦于没有自己想要的固件,没办法,找个大佬的源码自己编译吧。
--&gt;
&lt;h4&gt;为斐讯K2P编译OpenWRT固件&lt;/h4&gt;
&lt;p&gt;因为原作者推荐使用&lt;code&gt;Ubuntu  14 LTS x64&lt;/code&gt;但是DigitalOcean最低只有&lt;code&gt;Ubuntu 16 x64&lt;/code&gt;，所以这里选择16吧，应该差别不大，内存选择4G，因为在编译的过程中有个阶段会占用很大的内存，第一次编译的时候我选择了1G内存，后来出错了，索性选4G内存吧。&lt;/p&gt;
&lt;h4&gt;前期准备&lt;/h4&gt;
&lt;p&gt;SSH 登录 VPS，修改远程端口，安装 &lt;code&gt;vim&lt;/code&gt; 和 &lt;code&gt;screen&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;apt-get update
apt-get install vim screen -y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原作者推荐不要使用&lt;code&gt;root&lt;/code&gt;用户&lt;code&gt;git&lt;/code&gt;和编译，所以先使用&lt;code&gt;root&lt;/code&gt;权限创建一个用户 openwrt&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 添加用户
adduser openwrt
# 设置密码
passwd openwrt
# 为该用户指定命令解释程序（通常为/bin/bash）
usermod -s /bin/bash openwrt
# 为该用户添加sudo权限
# /etc/sudoers文件默认是只读的，对root来说也是，因此需先添加sudoers文件的写权限
chmod u+w /etc/sudoers
# 编辑sudoers文件
vim /etc/sudoers 
# 找到这行 root ALL=(ALL) ALL,在他下面添加xxx ALL=(ALL) ALL (这里的xxx是你的用户名)
youruser ALL=(ALL:ALL) ALL
# 撤销sudoers文件写权限
chmod u-w /etc/sudoers
# 为新用户添加工作目录的读写权限
chown openwrt:openwrt -R /home/openwrt/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因为这里不需要使用openwrt用户远程登录，所有没有为openwrt配置SSH权限。&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;root&lt;/code&gt;用户登录vps，开启一个新会话，避免网络断线后正在执行的任务被取消&lt;/p&gt;
&lt;p&gt;&lt;code&gt;screen -S dev&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;切换到openwrt用户&lt;/p&gt;
&lt;p&gt;&lt;code&gt;su openwrt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;输入密码&lt;/p&gt;
&lt;h4&gt;开始编译&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get update

sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint
# lede 源码
git clone https://github.com/coolsnowwolf/lede
# MTK wifi 闭源驱动
git clone https://github.com/MeIsReallyBa/k2p-openwrt-mt7615_5.0.2.0.git
# 把 mtk 目录移动到 lede 源码中的 package 目录中
cd k2p-openwrt-mt7615_5.0.2.0
mv mtk/ /home/openwrt/lede/package/
# 编译前的配置
cd /home/openwrt/lede/
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Target System 选择 MediaTek Ralink MIPS，Subtarget 选择 MT7621 based boards，Target Profile 选择 Phicomm K2P，另外，建议勾选Build the Openwrt SDK ，方便日后交叉编译，我编译的时候没选，因为暂时用不到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562574342785.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选择 wifi 驱动&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在主菜单，找到MTK，回车进入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562574403986.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选中driver，回车进入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562574432551.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;先按Y选中KMOD-MT_WIFI，再回车进入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562574454679.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将First Wifi Interface选为MT7615E，其他两个选为NONE，按Y保证MT WIFI DRIVER被勾选。接着选择Wifi Operation Mode，回车进入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/156257447775.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按Y勾选AP，接着一直按EXIT返回到Driver目录，选中Wifi-L1profile回车进入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562574498598.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562574536462.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;保证1st card被勾选，按N取消对2nd 3rd card的勾选。这时候wifi驱动的勾选已经完成&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562574569718.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;openwrt的自带无线配置不支持mtk驱动，需要勾选mtk插件进行配置。按EXIT回到MTK目录，回车进入MISC，勾选MTK-Luci-plugin&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562574591824.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562574600364.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择&lt;code&gt;save&lt;/code&gt;保存配置&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;编译&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;make -j1 V=s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果一切正常，你最终可以在 bin/targets/ramips/mt7621 下找到编译好的固件&lt;/p&gt;
&lt;p&gt;&lt;code&gt;openwrt-ramips-mt7621-k2p-squashfs-sysupgrade.bin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562595111456.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;刷机后如果无法使用无线，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1562722281201.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;解决步骤：网络-接口-lan里的物理设置勾选ra0保存设置后5g出现，再勾选rax0会有2.4g。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/timothy93bp/article/details/77679000&quot;&gt;Ubuntu16.04系统中创建新用户&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/sinat_36118270/article/details/62899093&quot;&gt;解决linux下sudo更改文件权限报错xxxis not in the sudoers file. This incident will be reported.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/16376035/fatal-could-not-create-work-tree-dir-kivy&quot;&gt;新建用户 没有文件操作权限&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/coolsnowwolf/lede&quot;&gt;GitHub-coolsnowwolf/lede&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/MeIsReallyBa/k2p-openwrt-mt7615_5.0.2.0&quot;&gt;GitHub-MeIsReallyBa/k2p-openwrt-mt7615_5.0.2.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.right.com.cn/forum/thread-572784-1-1.html&quot;&gt;图解如何给k2p的openwrt18.06编译mtk闭源5.0.2.0驱动&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://webcache.googleusercontent.com/search?q=cache:ptnlUpuOowkJ:https://www.asmodeus.cn/archives/728+&amp;amp;cd=1&amp;amp;hl=zh-CN&amp;amp;ct=clnk&amp;amp;gl=us&quot;&gt;为斐讯K2P编译OpenWRT LEDE，并启用mtk闭源wifi驱动及H3C认证&lt;/a&gt;(谷歌快照，可能会失效)&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%B8%BA%E6%96%90%E8%AE%AFK2P%E7%BC%96%E8%AF%91OpenWRT%E5%9B%BA%E4%BB%B6.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%B8%BA%E6%96%90%E8%AE%AFK2P%E7%BC%96%E8%AF%91OpenWRT%E5%9B%BA%E4%BB%B6.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>绝望与希冀</title>
            <description>
            &lt;!--
author: 科学松鼠会
date: 2019-06-05
title: 绝望与希冀
tags: 习得性无助
category: 转载
status: publish
summary: 曾经我也想过一了百了，但是再难也请你不要放弃思考好吗！
--&gt;
&lt;h4&gt;绝望与希冀&lt;/h4&gt;
&lt;h4&gt;绝望：习得性无助&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./img/1559725368609.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;【图片出处：www.progressivelap.com】&lt;/p&gt;
&lt;p&gt;六十多年前，哈佛大学的几位科学家理查德·所罗门（Richard Solomon）、莱昂·卡明（ Leon Kamin）和莱曼韦恩（Lyman Wynne）等人拿着人类的好伙伴来做了个残酷的实验。他们把40只汪星人放在箱子里，箱子用隔断分成两半。在汪们所在的一边，实验人员对箱底通电，遭受电击的小家伙惨叫连连，它们试图通过不是很高的隔断板跳到另一边。但要命的是，跳过去之后，另一边也被通上了电，于是多次遭受的汪星人最后都放弃了跳跃，即使另一边再也不通电了它们也不会去再次尝试。关于这些实验的文章发表在了1953年的《异常和社会心理学期刊》（The Journal of Abnormal and Social Psychology）上。&lt;/p&gt;
&lt;p&gt;过了大约十年，滨州大学的心理学家马丁·塞利格曼（Martin Seligman）多次以不同形式重复了这个实验。比如说，他将三组汪星人引入，第一组被简单地加上了鞍具，随即解下，没有遭受什么痛苦；第二组被加上鞍具之后，接受短暂电击，但汪自己可以经由碰触前面的杠杆来中断电击；第三组也接受短暂电击，它前面也有杠杆，但杠杆没有中断电击的作用。·塞利格曼教授经过这些实验发展出了赫赫有名的“习得性无助”（Learned helplessness）理论，亦即经过某种学习而得来的无助感——当发现通过抗争或适应性调整也不能逃脱不良环境的威胁时，动物或人就会放弃努力，表现为此后的消极行为。&lt;/p&gt;
&lt;p&gt;对人类来说，习得性无助最典型的一个发生环境就是集中营。我们能从2004年诺贝尔文学奖得主凯尔泰斯·伊姆莱（(Kertész Imre）的自传体小说《无命运的人生》里清晰无比地读到这一点，小说写的是一名布达佩斯少年被抓到纳粹集中营、从奥斯威辛到布痕瓦尔德到蔡茨的过程，原本乐观的他和其他犯人一起慢慢屈从于越来越恶劣的生存环境，放弃反抗，放弃求助，直至最后丧失了求生意志。说实话，读伊姆莱小说对我而言是无比难捱的一种折磨，基本上难以坚持下来，除了他之外，还没有任何一位作家的作品给过这么强烈的绝望感。我还能记得大约十年之前自己在上海徐汇区一个租来的小房子里读它时的心情，就好像溺水时什么也抓不到一样。&lt;/p&gt;
&lt;p&gt;面对被强加的绝望，多数动物或人所能做的都是放弃选择，任由环境处置，甚而，自己也成为环境的帮凶。哲学家汉娜·阿伦特在探讨“平庸之恶”的时候就指出了这一点，并且她认识到屈从的关键是拒绝思考，在极权的压力下，你不再甄别自己行为的对错、后果和意义。藉由这种集体无意识，绝望逐渐蔓延，从一个人到另一个人，从一群人到一群人。&lt;/p&gt;
&lt;p&gt;人就是这么脆弱如苇的一种动物。一旦你拒绝思考，你就真的什么也做不到、什么也选不了了。&lt;/p&gt;
&lt;p&gt;不过，曾担任过美国心理学会主席的马丁·塞利格曼其实倒不是一味专门研究绝望的专家，在他的职业生涯中，最卓著的贡献并非虐狗，而是建立了积极心理学——2004年他的TED演讲即以此为题展开，这是一门采用科学原则和方法来研究幸福的课题。他也主张用习得性乐观用来对抗习得性无助。&lt;/p&gt;
&lt;p&gt;言及此处，我会想，要不要谈谈爱情里的绝望呢？对于现代生活中的平常女性来说，能让人深刻体会到绝望的事物，爱情算是很重要的一种。爱而不能得或者爱而被亏欠，都能将一个人拖进如坠深渊的境地，但，谁也都知道，只要死不了，就不可能永远绝望下去。你看，连被嫌弃了一生的松子都不绝望，你又有什么资格绝望？&lt;/p&gt;
&lt;h4&gt;希冀：只能往前看的眼睛&lt;/h4&gt;
&lt;p&gt;我们人类中的大多数，从出生一刻便被告知，你的毕生追求是：幸福。由此而展开漫漫求索之路，而不断磕碰、摔倒、撞得头破血流甚或堕入深渊。这其中也有一些（数量还不在少），倾尽全力之后依然发现，自己距离这个目标非但没有更近，反而越来越远。&lt;/p&gt;
&lt;p&gt;科学对此自有解释，根据安德鲁·奥斯瓦尔德（Andrew Oswald）等人的一项研究，人的幸福感是固定的。每个个体都有一个幸福基准线，在生活这条长河中，面对微澜或者波浪，你的幸福感会随着基准线上下波动，但不会偏离太远，哪怕因为重大变故一下子冲到爆表，也终将慢慢回归。无论是因为车祸而失去了双腿还是中了六合彩而一夜暴富，当事人在过个几年之后，也就差不多没事人一个了，每天到底是乐呵呵还是苦哈哈，与最初无异。如果你天生是个不大能快乐的人，也很难通过赚更多的钱或拥有一个看似正常的美满家庭而如何如何。此被称作“幸福定值理论”。&lt;/p&gt;
&lt;p&gt;也有对此提出异议的研究者。2010年，来自墨尔本大学的布鲁斯·黑迪（Bruce Headey）团队通过一个长达25年的大型追踪调查，考察了生活方式、工作、社交、信仰等各个方面对人的影响，得出结论是：你所选择的生活，还是会很大程度影响主观感受的。比如对于婚姻或长期关系来说，和严重神经过敏的人在一起，幸福感会越来越低，而对于女性来说，如果较为肥胖，会很大程度削弱幸福感。上世纪末本世纪初兴起的“积极心理学”，很大一部分的研究就是在努力探寻人如何能以主观努力来改变自己的幸福感。上面提到的塞利格曼教授正是这个学说的创始人之一。&lt;/p&gt;
&lt;p&gt;对人生快乐的希冀，大抵也是在“就这样了”和“不行还有救”之间振荡，正对应着以上的两种说法。事实上它们并不绝对矛盾，基因与环境一起塑造并改造我们，一个人感到快乐、获取幸福的能力当然有先天的基础，快乐天注定，却也视乎能多大程度地发掘吧。&lt;/p&gt;
&lt;p&gt;大脑中，影响我们这种主观感受的部位，被认为存在于调节情绪与动机的前扣带回皮质与负责情绪记忆处理的杏仁核。哈佛大学的研究人员丹尼尔·沙克特（Daniel Schacter）和唐娜·阿迪斯（Donna Addis）等人发现，核磁共振成像下，当被试思考积极乐观的问题时，这两个部位就被激活，而转向消极悲观的思考之时，它们就受到抑制。所以，不妨如此来描述对幸福的求索这项人类活动：它的目的是最大程度地激活我们的前扣带回皮质和杏仁核。更有趣的是，大脑中还有一个尾状核，它在我们去憧憬幸福（好事情）时被激活，而一旦结果并不如预期，它会将之记录下来，以调整下一次的期望值。&lt;/p&gt;
&lt;p&gt;上述三个大脑区域，在关于爱情的科学研究中也表现得超乎寻常之重要，有脑成像记录到，很多涉及爱的测试当中，如让被试去看心上人的照片、回想两个人交往的一些细节时，这些部位会闪耀得激情璀璨。当然，情感完满，也是人生幸福中的一大组成。&lt;/p&gt;
&lt;p&gt;但就是有人完全没法找到期待所在，怎么办？鲁迅曾对许广平说过“我知道，你的反抗是因为有希望，而我的反抗是没有希望，不但没有希望，连绝望都没有”，这句话可谓非常戳中，也许这才是活着的全部要义。黑暗中寻找光明，甚或黑暗中只是要倔强走下去也不在意那一个光明，这种本能都已经写在了基因里。倘若对于死亡的恐惧超出了对于生存的乐观，人类的整体生存是不可能的，所以演化给了人希翼的勇气，也就是那双一直只能往前看的眼睛。要知道，我们的生境再怎么也不会比原始先祖们来得差，最终让你和我存活于世的其实只有两种东西：非理智的乐观，理性的悲观。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://songshuhui.net/archives/90929&quot;&gt;绝望与希冀&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;由于科学松鼠会采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议，因此转载了本文，如有侵权请根据网站的给出的邮件地址联系，谢谢！&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E7%BB%9D%E6%9C%9B%E4%B8%8E%E5%B8%8C%E5%86%80.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E7%BB%9D%E6%9C%9B%E4%B8%8E%E5%B8%8C%E5%86%80.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>《建筑学概论》</title>
            <description>
            &lt;!--
author: admin
date: 2019-05-27
title: 《建筑学概论》
tags: 爱情
category: 碎碎念
status: publish
summary: 给你一张过去的CD,听听那时我们的爱情...
--&gt;
&lt;h4&gt;《建筑学概论》&lt;/h4&gt;
&lt;p&gt;偶然间从网上看到了这部电影的简介，然后在优酷上看完了。&lt;/p&gt;
&lt;p&gt;没有经历过电影中的情节，但是亲身的经历却也可以拍出一部电影了，所以有很多共鸣。&lt;/p&gt;
&lt;p&gt;很多评论和弹幕都说，瑞妍绿茶，心机。&lt;/p&gt;
&lt;p&gt;我不知道她们说的是大学时期的瑞妍，还是离婚之后来找胜民的瑞妍。&lt;/p&gt;
&lt;p&gt;年轻时候的瑞妍，出生在济州岛这个穷地方，一直想来首尔，来看看这个世间的繁华，然而，即使来到了首尔，却也只能住在相对贫穷的江北，贞陵，而首尔真正的繁华在江南。&lt;/p&gt;
&lt;p&gt;每个女孩都有着做公主的梦，喜欢高富帅，向往有钱人的生活，这是人性，天生就有了，或许键盘侠才会要求别人过着苦行僧的日子吧。&lt;/p&gt;
&lt;p&gt;在和胜民和高富帅学长的交往中，瑞妍渐渐明白了自己想要的，成长了，只是这种成长在男主胜民的视角下模糊着，让观众觉得瑞妍对胜民的感情不专一，摇摆着，继而觉得男主是一个备胎罢了。&lt;/p&gt;
&lt;p&gt;这种感觉在学长嘲笑胜民衣服时达到了高潮，学长开着车，喜欢的女孩坐在副驾驶，自己默默的坐在后座，听着他们有说有笑，还不时嘲笑自己几句。任谁都是愤然离去。&lt;/p&gt;
&lt;p&gt;初恋的美好，就在于，两个人在关系中是平等的，毫无经验，都需要摸索着前进，而不是情场高手，摆弄着欲擒故纵，爱情三十六计。&lt;/p&gt;
&lt;p&gt;有人讨厌高富帅学长，有人讨厌拜金的瑞妍，有人讨厌懦弱的胜民。&lt;/p&gt;
&lt;p&gt;看完整个故事，我谁都不讨厌。人生哪能处处圆满呢？那不过是世人的遗憾，不甘罢了&lt;/p&gt;
&lt;p&gt;建筑学概论教室里的同学换了一批又一批，可能下个学期新来的学生也会重复着瑞妍和胜民的爱情吧，可能那个瑞妍会和胜民在一起吧。&lt;/p&gt;
&lt;p&gt;最后，抄一段分分妹说的总结吧&lt;/p&gt;
&lt;p&gt;往事铺面而来，泪水潸然而下&lt;/p&gt;
&lt;p&gt;我们留不住时光，却在时光里慢慢长大&lt;/p&gt;
&lt;p&gt;青春在记忆里飘荡，往事在时光里欢畅&lt;/p&gt;
&lt;p&gt;初恋攥在对方手里，痛苦刻在自己心上&lt;/p&gt;
&lt;p&gt;往事和伤口&lt;/p&gt;
&lt;p&gt;一个无法愈合，一个不堪回首&lt;/p&gt;
&lt;p&gt;后悔和错过&lt;/p&gt;
&lt;p&gt;一个已无法重来，一个请及时放手&lt;/p&gt;
&lt;p&gt;始于无痕，终于无缘&lt;/p&gt;
&lt;p&gt;天各一方，各自安好&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/p1565897670.jpg&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1559051529832.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/p1651615885.jpg&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/p2195047707.jpg&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;青春这杯酒终将要咽进喉咙里，酸甜苦辣，还有点呛喉。&lt;/p&gt;
&lt;p&gt;终于，嘴里的味道越来越淡。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E3%80%8A%E5%BB%BA%E7%AD%91%E5%AD%A6%E6%A6%82%E8%AE%BA%E3%80%8B.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E3%80%8A%E5%BB%BA%E7%AD%91%E5%AD%A6%E6%A6%82%E8%AE%BA%E3%80%8B.html</guid>
                                               <category>碎碎念</category>
                                    </item>
                <item>
            <title>编译安装Nginx</title>
            <description>
            &lt;!--
author: admin
date: 2019-05-24
title: 编译安装Nginx
tags: nginx,TLS1.3
category: Linux
status: publish
summary: 编译安装 Nginx 来启用 TLS1.3
--&gt;
&lt;h4&gt;编译安装Nginx&lt;/h4&gt;
&lt;p&gt;因为&lt;code&gt;Ubuntu 18.04 LTS&lt;/code&gt;使用&lt;code&gt;apt-get install nginx&lt;/code&gt;安装的nginx是不支持&lt;code&gt;tls1.3&lt;/code&gt;的，所有需要从源码编译安装&lt;/p&gt;
&lt;p&gt;本文使用&lt;code&gt;root&lt;/code&gt;用户，在&lt;code&gt;/root/&lt;/code&gt;目录下操作&lt;/p&gt;
&lt;h4&gt;需要的源码&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;openssl-1.1.1c
pcre-8.43
cloudflare  zlib
nginx-1.17.3&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;安装编译工具&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;apt-get install git gcc make build-essential -y&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;下载源码&lt;/h4&gt;
&lt;p&gt;新建一个&lt;code&gt;src&lt;/code&gt;目录，用来放下载的源码&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mkdir src &amp;amp;&amp;amp; cd src&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;wget --no-check-certificate https://nginx.org/download/nginx-1.17.3.tar.gz
tar -zxvf nginx-1.17.3.tar.gz &amp;amp;&amp;amp; rm nginx-1.17.3.tar.gz &amp;amp;&amp;amp; mv nginx-1.17.3/ nginx

wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1c.tar.gz
tar -zxvf openssl-1.1.1c.tar.gz &amp;amp;&amp;amp; rm openssl-1.1.1c.tar.gz &amp;amp;&amp;amp; mv openssl-1.1.1c/ openssl

# Don&#039;t choose pcre2
wget --no-check-certificate https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar -zxvf pcre-8.43.tar.gz &amp;amp;&amp;amp; rm pcre-8.43.tar.gz &amp;amp;&amp;amp; mv pcre-8.43/ pcre

git clone https://github.com/cloudflare/zlib.git
# If you get the error below,you need run &#039;apt-get install --reinstall ca-certificates&#039;
# fatal: unable to access &#039;https://github.com/cloudflare/zlib.git&#039;: Problem with the SSL CA cert (path? access rights?)
cd zlib/
make -f Makefile.in distclean
cd&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;其他编译配置&lt;/h4&gt;
&lt;p&gt;在编译 nginx 时，默认会以 debug 模式来运行，取消 debug 的好处是编译后的 nginx 更加小巧，编译更快。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vim /root/src/nginx/auto/cc/gcc
## 注释掉下边的两行
-------------------------
# debug
CFLAGS=&quot;$CFLAGS -g&quot;
-------------------------&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;编译安装&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;cd ~/src/nginx
./configure \
# 设置使用时的默认用户
--user=www-data \
# 设使用时的工作组
--group=www-data \
# 编译生成文件目录
--prefix=/usr/local/nginx \
# 设置可执行文件的名称,此名称仅在安装期间使用
--sbin-path=/usr/local/nginx/sbin/nginx \
# 设置配置文件路径
--conf-path=/usr/local/nginx/conf/nginx.conf \
# 设置将存储主进程的进程标识的文件的名称
--pid-path=/run/nginx.pid \
# 设置日志路径,需提前创建/var/log/nginx目录
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
# Optional Modules
--with-compat \
--with-file-aio \
--with-threads \
--with-http_v2_module \
--with-http_realip_module \
--with-openssl=../openssl --with-http_ssl_module \
--with-pcre=../pcre --with-pcre-jit \
--with-zlib=../zlib --with-http_gzip_static_module \

make &amp;amp;&amp;amp; make install &lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;配置conf&lt;/h4&gt;
&lt;p&gt;&lt;del&gt;编译安装的 nginx，目录结构和 apt 安装的有大同小异。apt 安装时， nginx.conf 配置文件会在安装目录的根目录下。编译安装时， nginx.conf 配置文件会在安装目录的 conf 文件夹下&lt;/p&gt;
&lt;p&gt;&lt;del&gt;这里位于&lt;code&gt;/etc/nginx/conf/nginx.conf&lt;/code&gt;，记得在里面添加&lt;code&gt;pid        /run/nginx.pid;&lt;/code&gt;，默认是注释掉的&lt;/p&gt;
&lt;h4&gt;为nginx配置systemd&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;vim /etc/systemd/system/nginx.service

[Unit]
Description=nginx - high performance web server
After=network.target

[Service]
Type=forking
ExecStartPost=/bin/sleep 0.1
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;启动服务&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;systemctl daemon-reload #重载
systemctl enable nginx #开机启动
systemctl start nginx #运行&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们现在可以用&lt;code&gt;service&lt;/code&gt;或&lt;code&gt;systemctl&lt;/code&gt;管理&lt;code&gt;nginx&lt;/code&gt;了&lt;/p&gt;
&lt;p&gt;&lt;code&gt;service nginx restart&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;查看版本&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;/usr/local/nginx/sbin/nginx -V&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://lushan.me/archives/22/&quot;&gt;编译安装 nginx 支持 TLS 1.3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhih.me/make-your-website-support-tls1-3/&quot;&gt;编译Nginx支持TLS1.3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.svennd.be/pid-file-runnginx-pid-not-readable-yet-after-start/&quot;&gt;PID file /run/nginx.pid not readable (yet?) after start&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/35821245/github-server-certificate-verification-failed&quot;&gt;github: server certificate verification failed&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nginx.com/resources/wiki/start/topics/tutorials/installoptions/&quot;&gt;Installation and Compile-Time Options&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85Nginx.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85Nginx.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>编译安装OpenSSL</title>
            <description>
            &lt;!--
author: admin
date: 2019-04-28
title: 编译安装OpenSSL
tags: openssl,TLS1.3
category: Linux
status: publish
summary: 本文为 How to Install the latest OpenSSL version from Source on Linux 的简化版,原文链接在参考资料处
--&gt;
&lt;h4&gt;编译安装OpenSSL&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;Ubuntu 18.04.1 LTS&lt;/code&gt; 自带的 &lt;code&gt;OpenSSL&lt;/code&gt;版本是 &lt;code&gt;openssl 1.1.0g&lt;/code&gt;，因为 &lt;code&gt;Nginx&lt;/code&gt; 支持 &lt;code&gt;TLS 1.3&lt;/code&gt; 至少需要 &lt;code&gt;OpenSSL 1.1.1&lt;/code&gt; 或者更高，所以需要源码编译下。&lt;/p&gt;
&lt;h4&gt;卸载系统自带OpenSSL&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 删除软件及其配置文件
# apt-get --purge remove &amp;lt;package&amp;gt;
apt-get --purge remove openssl&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;安装依赖&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;apt-get update
apt-get install build-essential checkinstall zlib1g-dev -y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;del&gt; ####下载源码&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;cd /usr/local/src/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;wget https://www.openssl.org/source/openssl-1.1.1b.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;tar -zxvf openssl-1.1.1b.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;下载源码&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1c.tar.gz
tar -zxvf openssl-1.1.1c.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;del&gt; ####编译安装&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;cd openssl-1.1.1b&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;make &amp;amp;&amp;amp; make install&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;编译安装&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd openssl-1.1.1c
./config --prefix=/usr/local/openssl #编译生成文件位置
make &amp;amp;&amp;amp; make install&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;命令软链【或添加环境变量均可】&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# mv /usr/bin/openssl /usr/bin/openssl.bak 在卸载时已经删除
ln -sv /usr/local/openssl/bin/openssl /usr/bin/openssl
# mv /usr/include/openssl /usr/include/openssl.bak 在卸载时已经删除
ln -sv /usr/local/openssl/include/openssl /usr/include/openssl&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;del&gt; ####配置链接库&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;cd /etc/ld.so.conf.d/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;vim openssl-1.1.1c.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;# Paste the openssl library path directory.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;/usr/local/ssl/lib&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;# Save and exit.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;ldconfig -v&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;配置链接库&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /etc/ld.so.conf.d/
vim openssl-1.1.1c.conf
# Paste the openssl library path directory.
/usr/local/openssl/lib
# Save and exit.
ldconfig -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;del&gt; And you will see the OpenSSL libraries on the &#039;/usr/local/ssl/lib&#039; directory has been loaded.&lt;/p&gt;
&lt;p&gt;&lt;del&gt; ####配置 OpenSSL 库&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;vim /etc/environment&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;# Now add the new OpenSSL binary directory as below&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;PATH=&quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/ssl/bin&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;# Save and exit.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;# Reload the environment file and test new updated binary PATH.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;source /etc/environment&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;echo $PATH&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; Now check again the OpenSSL binary file.&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;which openssl&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; ####报错&lt;/p&gt;
&lt;p&gt;&lt;del&gt; 当你完成上述步骤，然后执行&lt;code&gt;openssl version&lt;/code&gt;，然后就报错了......&lt;/p&gt;
&lt;p&gt;&lt;del&gt; Github上有专门的issue&lt;a href=&quot;https://github.com/openssl/openssl/issues/5845&quot;&gt;`OPENSSL_1_1_1&#039; not found (required by openssl) #5845&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; 主要是&lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt;这个环境变量没有指定，所以导致openssl正在使用旧的系统OpenSSL库&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;openssl:/usr/lib/libssl.so.1.1: version&lt;/code&gt;OPENSSL_1_1_1&#039; not found (required by openssl)`&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;openssl:/usr/lib/libcrypto.so.1.1: version&lt;/code&gt;OPENSSL_1_1_1&#039; not found (required by openssl)`&lt;/p&gt;
&lt;p&gt;&lt;del&gt; 这个时候你需要找到你新安装的&lt;code&gt;openssl&lt;/code&gt;的位置&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;which openssl&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;/usr/local/ssl/bin/openssl&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; 看看它的上级目录有没有&lt;code&gt;lib&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; 我这里按照我的实际情况，执行&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;echo &quot;export LD_LIBRARY_PATH=/usr/local/ssl/lib&quot; &amp;gt;&amp;gt; ~/.bashrc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt; &lt;code&gt;export LD_LIBRARY_PATH=/usr/local/ssl/lib&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后再次查看 &lt;code&gt;openssl version&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;OpenSSL 1.1.1c  28 May 2019&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.howtoforge.com/tutorial/how-to-install-openssl-from-source-on-linux/&quot;&gt;How to Install the latest OpenSSL version from Source on Linux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/RookieWutongshu/article/details/86728315&quot;&gt;安装openssl报错openssl: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version `OPENSSL_1_1_1&#039; not found&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wuyanteng.github.io/2018/09/07/%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85openssl/&quot;&gt;编译安装openssl&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85OpenSSL.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85OpenSSL.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>使用Git上传本地代码到GitHub</title>
            <description>
            &lt;!--
author: admin
date: 2019-04-19
title: 使用Git上传本地代码到GitHub
tags: Git,GitHub
category: Program
status: publish
summary: 本文转载自网络,有增删改,来源见文末
--&gt;
&lt;h4&gt;使用Git上传本地代码到GitHub&lt;/h4&gt;
&lt;h4&gt;首先在GitHub上创建一个新的repository&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535251765388.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为仓库取一个名字，点击创建仓库按钮 你将成功创建一个仓库&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535251780713.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;安装Git&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://gitforwindows.org/&quot;&gt;Git for Windows&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;访问上面的网站并下载安装&lt;/p&gt;
&lt;h4&gt;配置Git&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535251962475.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击创建 Create New Repository 选择好本地代码仓库所在的文件夹，此时多出来一个.git文件夹，这就表示本地git创建成功。进入刚才的文件夹，右键Git Bash进入git命令行，第一次在本地仓库操作需要先执行git init命令&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252148235.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;配置密钥&lt;/h4&gt;
&lt;p&gt;为了把本地的仓库传到 github，还需要配置 ssh key&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ssh-keygen -t rsa -C &quot;your_email@youremail.com&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;后面的your_email@youremail.com改为你的邮箱。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252232060.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;直接点回车，说明会在默认文件id_rsa上生成ssh key&lt;/p&gt;
&lt;p&gt;然后系统要求输入密码，直接按回车表示不设密码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252253409.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;重复密码时也是直接回车，之后提示你shh key已经生成成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252265781.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我们进入提示的地址下查看ssh key文件。 &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252287270.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开id_rsa.pub，复制里面的key。&lt;/p&gt;
&lt;p&gt;回到github网站，进入Account Settings，左边选择SSH Keys，Add SSH Key&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252315638.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;title随便填，粘贴key&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252354121.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;验证是否成功，在git bash下输入&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ssh -T git@github.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;回车就会看到：You’ve successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252403176.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来我们要做的就是把本地仓库传到github上去，在此之前还需要设置username和email，因为github每次commit都会记录他们&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git config --global user.name &quot;your name&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git config --global user.email &quot;your_email@youremail.com&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;分别输入上述命令行 回车。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252457407.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入要上传的仓库，右键 git bash，添加远程地址&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git remote add origin git@github.com:yourName/yourRepo.git&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;后面的yourName和yourRepo表示你再github的用户名和刚才新建的仓库，加完之后进入.git，打开config，这里会多出一个remote “origin”内容，这就是刚才添加的远程地址，也可以直接修改config来配置远程地址&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252516185.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;与github上的对应&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535252528769.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;上传代码&lt;/h4&gt;
&lt;p&gt;将所有文件添加到仓库&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;提交&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git commit -m &quot;CommitInfo&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;再执行语句 &lt;code&gt;git push  origin master&lt;/code&gt;即可完成代码上传到 github&lt;/p&gt;
&lt;h4&gt;日常修改代码后提交&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;git add -A&lt;/code&gt;是将所有的修改都提交。你可以用&lt;code&gt;git status&lt;/code&gt;查看当前的变化，然后通过&lt;code&gt;git add xxx&lt;/code&gt;有选择的提交。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git commit&lt;/code&gt; 是将变化先提交到本地。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git commit -m &quot;xxxx&quot;&lt;/code&gt; 其中引号中间是提交的说明文字。&lt;/p&gt;
&lt;p&gt;如果直接&lt;code&gt;git commit&lt;/code&gt;, 会出现一个vi界面，在里面输入提交的说明。C-o 保存，之后C-x退出并提交。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git push&lt;/code&gt; 时将修改&lt;code&gt;push&lt;/code&gt;到远端&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;git clone -&amp;gt; 工作区 -&amp;gt; git add -&amp;gt; 暂存区 -&amp;gt; git commit -&amp;gt; 版本库 -&amp;gt; git push -&amp;gt; 远程自己的仓库 -&amp;gt; pull request -&amp;gt; 别人项目的仓库&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;failed to push some refs to 解决方法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;出现错误的主要原因是github中的README.md文件不在本地代码目录中
可以通过如下命令进行代码合并【注：pull=fetch+merge】&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git pull --rebase origin master&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;执行上面代码后可以看到本地代码库中多了README.md文件&lt;/p&gt;
&lt;h4&gt;git 设置和取消代理&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git config --global https.proxy http://127.0.0.1:1080
git config --global https.proxy https://127.0.0.1:1080
git config --global --unset http.proxy
git config --global --unset https.proxy&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;强制覆盖本地代码（与git远程仓库保持一致）&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;git fetch --all &amp;amp;&amp;amp; git reset --hard origin/master &amp;amp;&amp;amp; git pull&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;强制覆盖远程代码&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;git push -f&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jianshu.com/p/14408d8d0460&quot;&gt;failed to push some refs to 解决方法&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://1ke.co/course/194&quot;&gt;如何使用Git上传项目代码到github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/u010520912/article/details/18993001&quot;&gt;使用Git将本地代码上传到GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://segmentfault.com/q/1010000004846781&quot;&gt;git提交代码步骤&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/laispace/666dd7b27e9116faece6&quot;&gt;git 设置和取消代理&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8Git%E4%B8%8A%E4%BC%A0%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%A0%81%E5%88%B0GitHub.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8Git%E4%B8%8A%E4%BC%A0%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%A0%81%E5%88%B0GitHub.html</guid>
                                               <category>Program</category>
                                    </item>
                <item>
            <title>使用mkcert为localhost(本地)站点添加被浏览器信任的证书</title>
            <description>
            &lt;!--
author: admin
date: 2019-04-17
title: 使用mkcert为localhost(本地)站点添加被浏览器信任的证书
tags: Apache,SSL,phpStudy
category: PHP
status: publish
summary: 方便在本地调试HTTPS站点
--&gt;
&lt;h4&gt;使用mkcert为localhost(本地)站点添加被浏览器信任的证书&lt;/h4&gt;
&lt;h5&gt;环境&lt;/h5&gt;
&lt;p&gt;Windows 2016 LTS 64 bit&lt;/p&gt;
&lt;p&gt;PhpStudy 2017 (PHP 7.0.12 nts + Apache)&lt;/p&gt;
&lt;p&gt;mkcert for windows&lt;/p&gt;
&lt;p&gt;Chrome 73.0.3683.103&lt;/p&gt;
&lt;h4&gt;使用mkcert生成自签证书&lt;/h4&gt;
&lt;p&gt;下载&lt;a href=&quot;https://github.com/FiloSottile/mkcert/releases/download/v1.3.0/mkcert-v1.3.0-windows-amd64.exe&quot;&gt;mkcert for windows 64bit&lt;/a&gt;  如果遇到权限问题，以管理员权限运行。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1555460345143.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装根证书&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1555460526583.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;签发任意域名的证书&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1555460587455.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1555460625506.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;配置PhpStudy的Apache关于SSL的设置&lt;/h4&gt;
&lt;p&gt;确保你的apache编译了ssl模块，这是支持ssl证书必要的条件(如果没有，请编译,打开phpstudy——设置——PHP模块扩展——php-openssl前面勾选上)。&lt;img src=&quot;./img/1555460827663.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入到apache目录下，httpd.conf找到&lt;code&gt;#LoadModule ssl_module modules/mod_ssl.so&lt;/code&gt;，去掉前面的注释符，使得ssl模块生效(如果该模块已去掉注释，请不用操作)。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1555461022288.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;找到网站配置文件vhosts.conf，按照80的配置，另起一个VirtualHost443&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-conf&quot;&gt;&amp;lt;VirtualHost *:443&amp;gt;
    DocumentRoot &quot;C:\phpStudy\PHPTutorial\WWW\Pigeon&quot;
    ServerName www.pigeon.com
    ServerAlias pigeon
    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLCipherSuite AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL
    SSLCertificateFile &quot;C:\phpStudy\PHPTutorial\Apache\conf\ssl\www.pigeon.com.pem&quot; #(服务器上公钥证书路径)
    SSLCertificateKeyFile &quot;C:\phpStudy\PHPTutorial\Apache\conf\ssl\www.pigeon.com.key&quot; #(服务器上私钥证书路径)
    SSLCertificateChainFile &quot;C:\phpStudy\PHPTutorial\Apache\conf\ssl\ca-bundle.crt&quot; #(服务器上证书链路径)
    &amp;lt;Directory &quot;C:\phpStudy\PHPTutorial\WWW\Pigeon&quot;&amp;gt;
        Options FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
    &amp;lt;/Directory&amp;gt;
&amp;lt;/VirtualHost&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启apache&lt;/p&gt;
&lt;p&gt;apache正常重启后，在浏览器里面输入 &lt;a href=&quot;https://www.pigeon.com&quot;&gt;https://www.pigeon.com&lt;/a&gt; 就能看到安全锁出来啦。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1555462169743.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;HTTP 自动跳转到 HTTPS&lt;/h4&gt;
&lt;p&gt;进入到apache目录下，httpd.conf找到&lt;code&gt;#LoadModule rewrite_module modules/mod_rewrite.so&lt;/code&gt;，去掉前面的注释符&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1555462659576.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在网站根目录创建&lt;code&gt;.htaccess&lt;/code&gt;文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RewriteEngine On 
RewriteCond %{HTTPS}  !=on 
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;windows系统中创建以点&lt;code&gt;.&lt;/code&gt;开头的文件及文件夹的方法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用命令行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1555463101113.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/FiloSottile/mkcert&quot;&gt;Github·mkcert&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.wosign.com/faq/faq-phpstudy-ssl.htm&quot;&gt;phpstudy环境安装配置SSL证书方法&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.tecmint.com/redirect-http-to-https-on-apache/&quot;&gt;How to Redirect HTTP to HTTPS on Apache&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8mkcert%E4%B8%BAlocalhost%E7%AB%99%E7%82%B9%E6%B7%BB%E5%8A%A0%E8%A2%AB%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BF%A1%E4%BB%BB%E7%9A%84%E8%AF%81%E4%B9%A6.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8mkcert%E4%B8%BAlocalhost%E7%AB%99%E7%82%B9%E6%B7%BB%E5%8A%A0%E8%A2%AB%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BF%A1%E4%BB%BB%E7%9A%84%E8%AF%81%E4%B9%A6.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>MySQL自动备份shell脚本</title>
            <description>
            &lt;!--
author: 风澈vio
date: 2019-04-05
title: MySQL自动备份shell脚本
tags: MySQL,Shell
category: 转载
status: publish
summary: 自动备份数据库 , 配合GoogleDrive同步到云存储
--&gt;
&lt;h4&gt;MySQL自动备份shell脚本&lt;/h4&gt;
&lt;p&gt;文本为转载文章，源文章见最后&lt;/p&gt;
&lt;h4&gt;MySQL数据备份&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;vim mysqlBackup.sh&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

# 以下配置信息请自己修改
mysql_user=&quot;USER&quot; #MySQL备份用户
mysql_password=&quot;PASSWORD&quot; #MySQL备份用户的密码
mysql_host=&quot;localhost&quot;
mysql_port=&quot;3306&quot;
mysql_charset=&quot;utf8&quot; #MySQL编码
backup_db_arr=(&quot;db1&quot; &quot;db2&quot;) #要备份的数据库名称，多个用空格分开隔开 如(&quot;db1&quot; &quot;db2&quot; &quot;db3&quot;)
backup_location=/opt/mysql  #备份数据存放位置，末尾请不要带&quot;/&quot;,此项可以保持默认，程序会自动创建文件夹
expire_backup_delete=&quot;ON&quot; #是否开启过期备份删除 ON为开启 OFF为关闭
expire_days=3 #过期时间天数 默认为三天，此项只有在expire_backup_delete开启时有效

# 本行开始以下不需要修改
backup_time=`date +%Y%m%d%H%M`  #定义备份详细时间
backup_Ymd=`date +%Y-%m-%d` #定义备份目录中的年月日时间
backup_3ago=`date -d &#039;3 days ago&#039; +%Y-%m-%d` #3天之前的日期
backup_dir=$backup_location/$backup_Ymd  #备份文件夹全路径
welcome_msg=&quot;Welcome to use MySQL backup tools!&quot; #欢迎语

# 判断MYSQL是否启动,mysql没有启动则备份退出
mysql_ps=`ps -ef |grep mysql |wc -l`
mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`
if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then
        echo &quot;ERROR:MySQL is not running! backup stop!&quot;
        exit
else
        echo $welcome_msg
fi

# 连接到mysql数据库，无法连接则备份退出
mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password &amp;lt;&amp;lt;end
use mysql;
select host,user from user where user=&#039;root&#039; and host=&#039;localhost&#039;;
exit
end

flag=`echo $?`
if [ $flag != &quot;0&quot; ]; then
        echo &quot;ERROR:Can&#039;t connect mysql server! backup stop!&quot;
        exit
else
        echo &quot;MySQL connect ok! Please wait......&quot;
        # 判断有没有定义备份的数据库，如果定义则开始备份，否则退出备份
        if [ &quot;$backup_db_arr&quot; != &quot;&quot; ];then
                #dbnames=$(cut -d &#039;,&#039; -f1-5 $backup_database)
                #echo &quot;arr is (${backup_db_arr[@]})&quot;
                for dbname in ${backup_db_arr[@]}
                do
                        echo &quot;database $dbname backup start...&quot;
                        `mkdir -p $backup_dir`
                        `mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set=$mysql_charset | gzip &amp;gt; $backup_dir/$dbname-$backup_time.sql.gz`
                        flag=`echo $?`
                        if [ $flag == &quot;0&quot; ];then
                                echo &quot;database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz&quot;
                        else
                                echo &quot;database $dbname backup fail!&quot;
                        fi

                done
        else
                echo &quot;ERROR:No database to backup! backup stop&quot;
                exit
        fi
        # 如果开启了删除过期备份，则进行删除操作
        if [ &quot;$expire_backup_delete&quot; == &quot;ON&quot; -a  &quot;$backup_location&quot; != &quot;&quot; ];then
                 #`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;`
                 `find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf`
                 echo &quot;Expired backup data delete complete!&quot;
        fi
        echo &quot;All database backup success! Thank you!&quot;
        exit
fi&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;MySQL数据恢复&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;mysql -u username -p databse &amp;lt; backup.sql&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jianshu.com/p/746db5ceec02&quot;&gt;CentOS 7 MySQL自动备份shell脚本&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/MySQL%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BDshell%E8%84%9A%E6%9C%AC.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/MySQL%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BDshell%E8%84%9A%E6%9C%AC.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>Ubuntu 18.04挂载Google Drive当本地硬盘使用</title>
            <description>
            &lt;!--
author: admin
date: 2019-04-05
title: Ubuntu 18.04挂载Google Drive当本地硬盘使用
tags: GoogleDrive
category: Linux
status: publish
summary: 配合Crontab和shell能自动将VPS上的数据库和Markdown文件备份到Google云盘
--&gt;
&lt;h4&gt;Ubuntu 18.04挂载Google Drive当本地硬盘使用&lt;/h4&gt;
&lt;p&gt;使用工具：&lt;a href=&quot;https://github.com/astrada/google-drive-ocamlfuse&quot;&gt;Github · google-drive-ocamlfuse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本文使用&lt;code&gt;root&lt;/code&gt;权限安装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;add-apt-repository ppa:alessandro-strada/ppa
#如果出现错误：add-apt-repository: command not found，请使用以下命令解决
apt-get install software-properties-common
apt-get update
apt-get install google-drive-ocamlfuse -y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开访问 &lt;a href=&quot;https://console.developers.google.com&quot;&gt;https://console.developers.google.com&lt;/a&gt; 申请API&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1554459654274.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1554459668805.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1554459678194.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1554459692855.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1554459711185.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1554459720420.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;google-drive-ocamlfuse -headless -label googledrive -id 此处填写你的ID -secret 此处填写你的密钥&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回车后，你会得到一串URL地址，复制粘贴到你的浏览器中打开，你会得到一个验证码。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1554459864078.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入到路径：/root/.gdfuse/googledrive，打开config配置文件，填入你刚刚得到了验证码，保存该文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1554459907051.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;绑定Google Drive。使用以下命令绑定谷歌网盘：（/www/backup是挂载的路径，googledrive是刚刚验证密钥的时候创建的标签）&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;google-drive-ocamlfuse -label googledrive /www/backup
#出现错误：fuse: mountpoint is not empty
fuse: if you are sure this is safe, use the &#039;nonempty&#039; mount option
使用以下命令：
google-drive-ocamlfuse -label googledrive /www/backup -o nonempty&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成这些后，我没有成功，遇到了问题&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Input/output error&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;类似的issues&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/astrada/google-drive-ocamlfuse/issues/310&quot;&gt;Input/output error after mounting&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/astrada/google-drive-ocamlfuse/issues/237&quot;&gt;&amp;quot;Input/output error&amp;quot; after mount&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;按照开发者的建议添加 &lt;code&gt;-debug&lt;/code&gt;参数&lt;/p&gt;
&lt;p&gt;&lt;code&gt;google-drive-ocamlfuse -debug -label googledrive /www/backup&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后查看 &lt;code&gt;gdfuse.log&lt;/code&gt; and &lt;code&gt;curl.log&lt;/code&gt;两个文件的信息&lt;/p&gt;
&lt;p&gt;我遇到的问题是，API 是刚刚创建的，处于禁用状态，按照 &lt;code&gt;gdfuse.log&lt;/code&gt; 文件给出的信息去 Google APIs 启用下就OK了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1554460639711.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wzfou.com/linux-vps-drive/&quot;&gt;Linux VPS挂载Google Drive和Dropbox-实现VPS主机数据同步备份&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.51cto.com/wutou/1940580&quot;&gt;google-drive-ocamlfuse在linux挂载【详细版】&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Ubuntu_18.04%E6%8C%82%E8%BD%BDGoogle_Drive%E5%BD%93%E6%9C%AC%E5%9C%B0%E7%A1%AC%E7%9B%98%E4%BD%BF%E7%94%A8.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Ubuntu_18.04%E6%8C%82%E8%BD%BDGoogle_Drive%E5%BD%93%E6%9C%AC%E5%9C%B0%E7%A1%AC%E7%9B%98%E4%BD%BF%E7%94%A8.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>在Ubuntu 18.04 上安装 Pigeon</title>
            <description>
            &lt;!--
author: admin
date: 2019-04-04
title: 在Ubuntu 18.04 上安装 Pigeon
tags: MySQL,Pigeon,Note
category: PHP
status: publish
summary: 还是在Windows下用PhpStudy方便啊😂
--&gt;
&lt;h4&gt;在Ubuntu 18.04 上安装 Pigeon&lt;/h4&gt;
&lt;p&gt;之前在 V2EX 上搜索关于记录短信息的工具，有人推荐 Google Keep，但是身在墙国，腐朽资本主义的东西怎么能用呢！有人推荐 Pigeon ，然后搜索了一下，项目官网：&lt;a href=&quot;https://github.com/kasuganosoras/Pigeon&quot;&gt;https://github.com/kasuganosoras/Pigeon&lt;/a&gt; 看着挺简单轻便的，所以在自己的 VPS 上搭建下。&lt;/p&gt;
&lt;h4&gt;安装 Pigeon 之前&lt;/h4&gt;
&lt;p&gt;作为一个菜鸟，安装之前的配置花了我三天时间😭，人蠢果然没救了。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;apt-get update&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;apt-get install nginx php-fpm php-mysql php7.2-mbstring mysql-server -y&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nginx , php-fpm php.ini&lt;/code&gt;的配置参考之前关于&lt;code&gt;gitblog&lt;/code&gt;的文章，重点是&lt;strong&gt;开启短标签支持&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置MySQL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;就是这个东西花了我三天时间，后来换了一个关键词搜索立马就解决了，所以，关键词，特别是英文关键词在搜索方面是很重要的&lt;/p&gt;
&lt;p&gt;For fresh installations, recommend to run the included security script. This changes some of the less secure default options for things like remote root logins and sample users. On older versions of MySQL, you needed to initialize the data directory manually as well, but this is done automatically now.&lt;/p&gt;
&lt;p&gt;对于新安装来说，推荐运行内置的安全脚本&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mysql_secure_installation&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;按照提示来操作&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 验证密码强度
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: Y
---------------------------------------------------------------
# 三种等级的密码强度验证
There are three levels of password validation policy:

LOW    Length &amp;gt;= 8
MEDIUM Length &amp;gt;= 8, numeric, mixed case, and special characters
STRONG Length &amp;gt;= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
---------------------------------------------------------------
# 按照你选择的密码强度设置密码
Please set the password for root here.

New password: 
Re-enter new password:
---------------------------------------------------------------
# 检测你刚刚输入的密码强度
# 刚刚输入的密码强度是50
# 是否使用刚刚输入的密码？
Estimated strength of the password: 50 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) :
---------------------------------------------------------------
# 是否移除匿名用户
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) :
---------------------------------------------------------------
# 是否禁用root用户远程登录
Normally, root should only be allowed to connect from
&#039;localhost&#039;. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
---------------------------------------------------------------
# 是否移除测试数据库
By default, MySQL comes with a database named &#039;test&#039; that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
---------------------------------------------------------------
# 是否将上述设置立刻生效
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) :&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成后 MySQL 会禁止 root 远程登录&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mysql -h 127.0.0.1 -u root -p -P 3306&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;会提示&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ERROR ：&#039;Access denied for user &#039;root&#039;@&#039;localhost&#039;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这就导致我花了大量时间来解决这个错误，找遍了 stackoverflow 也没有好的解决方法，后来在 digitalocean 上找到了一篇 How To Install MySQL on Ubuntu 18.04 的文章，按照文章里的方法解决了，不得不说 digitalocean 的有些文章教程还是很好用的，下面引用下文章中的内容&lt;/p&gt;
&lt;p&gt;In Ubuntu systems running MySQL 5.7 (and later versions), the root MySQL user is set to authenticate using the &lt;code&gt;auth_socket&lt;/code&gt; plugin by default rather than with a password. This allows for some greater security and usability in many cases, but it can also complicate things when you need to allow an external program (e.g., phpMyAdmin) to access the user.&lt;/p&gt;
&lt;p&gt;就是说 MySQL 5.7 版本之后，数据库的 root 账号是通过 &lt;code&gt;auth_socket&lt;/code&gt; 这个插件来验证而不是通过密码，这样做更安全，但是如果你需要在外部程序（例如 phpMyAdmin）这样的工具访问就会使情况变得复杂&lt;/p&gt;
&lt;p&gt;解决方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In order to use a password to connect to MySQL as root, you will need to switch its authentication method from &lt;code&gt;auth_socket&lt;/code&gt; to &lt;code&gt;mysql_native_password&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;或者创建一个专属用户&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE USER &#039;sammy&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;password&#039;;
GRANT ALL PRIVILEGES ON *.* TO &#039;sammy&#039;@&#039;localhost&#039; WITH GRANT OPTION;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 sammy 登录MySQL进行操作&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设置MySQL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;MySQL的配置文件默认存放在&lt;code&gt;/etc/my.cnf&lt;/code&gt;或者&lt;code&gt;/etc/mysql/my.cnf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[client]
default-character-set = utf8

[mysqld]
collation-server = utf8_unicode_ci
init-connect=&#039;SET NAMES utf8&#039;
character-set-server = utf8
skip-character-set-client-handshake
default-storage-engine = INNODB

[mysql]
default-character-set = utf8&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启MySQL服务&lt;/p&gt;
&lt;h4&gt;安装 Pigeon&lt;/h4&gt;
&lt;p&gt;请参考作者Github的wiki&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kasuganosoras/Pigeon/wiki/Install&quot;&gt;https://github.com/kasuganosoras/Pigeon/wiki/Install&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;按照提示进行安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/kasuganosoras/Pigeon
cd Pigeon/
php install.php&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-18-04&quot;&gt;How To Install MySQL on Ubuntu 18.04&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kasuganosoras/Pigeon&quot;&gt;Github·Pigeon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.howtoforge.com/tutorial/install-apache-with-php-and-mysql-on-ubuntu-18-04-lamp/&quot;&gt;Ubuntu 18.04 (LTS) LAMP server tutorial with Apache, PHP 7.2, and MySQL&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%9C%A8Ubuntu_18.04_%E4%B8%8A%E5%AE%89%E8%A3%85_Pigeon.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%9C%A8Ubuntu_18.04_%E4%B8%8A%E5%AE%89%E8%A3%85_Pigeon.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>使用PHP创建一个计算字符串MD5值的页面</title>
            <description>
            &lt;!--
author: admin
date: 2019-03-26
title: 使用PHP创建一个计算字符串MD5值的页面
tags: MD5,Bootstrap
category: PHP
status: publish
summary: 使用PHP创建一个计算字符串MD5值的页面
--&gt;
&lt;h4&gt;使用PHP创建一个计算字符串MD5值的页面&lt;/h4&gt;
&lt;h4&gt;使用Bootstrap构建HTML页面&lt;/h4&gt;
&lt;p&gt;安照之前的文章在网站根目录放置好bootstrap相关的文件。&lt;/p&gt;
&lt;p&gt;主要内容是Bootstrap表单的内容，从Bootstrap手册上照搬就行了&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;form action=&quot;#&quot;&amp;gt;
&amp;lt;div class=&quot;form-group&quot;&amp;gt;
&amp;lt;label for=&quot;string&quot;&amp;gt;字符串:&amp;lt;/label&amp;gt;
&amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;text&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&amp;gt;提交&amp;lt;/button&amp;gt;
&amp;lt;input class=&quot;btn btn-primary&quot; type=&quot;reset&quot; value=&quot;重置&quot;&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再添加&lt;code&gt;h1&lt;/code&gt;标签，边框，阴影等，最后让所有元素居中显示&lt;code&gt;text-align:center;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1553588145517.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;PHP部分&lt;/h4&gt;
&lt;p&gt;点击提交按钮后，数据在当前页处理而不是跳转到其他页。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;form action=&quot;&amp;lt;?php echo $_SERVER[&quot;PHP_SELF&quot;];?&amp;gt;&quot; method=&quot;post&quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;POST 数据然后进行MD5值的计算&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
if(isset($_POST[&#039;SubmitButton&#039;]))
{
    $str = $_POST[&#039;text&#039;];
    echo md5($str);
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;先判断是否点击了提交按钮，再进行下一步计算&lt;/p&gt;
&lt;h4&gt;完整代码&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
    &amp;lt;title&amp;gt;MD5&amp;lt;/title&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
    &amp;lt;link href=&quot;./static/css/bootstrap.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;link href=&quot;./static/css/style.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
    &amp;lt;script src=&quot;./static/jquery/jquery-3.3.1.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;./static/js/bootstrap.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;./static/js/scripts.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container content border shadow-lg p-3 mb-5 bg-white rounded&quot;&amp;gt;
&amp;lt;h1&amp;gt;
计算MD5值
&amp;lt;/h1&amp;gt;
&amp;lt;form action=&quot;&amp;lt;?php echo $_SERVER[&quot;PHP_SELF&quot;];?&amp;gt;&quot; method=&quot;post&quot;&amp;gt;
&amp;lt;div class=&quot;form-group&quot;&amp;gt;
&amp;lt;label for=&quot;string&quot;&amp;gt;字符串:&amp;lt;/label&amp;gt;
&amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;text&quot; name=&quot;text&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot; name=&quot;SubmitButton&quot;&amp;gt;提交&amp;lt;/button&amp;gt;
&amp;lt;input class=&quot;btn btn-primary&quot; type=&quot;reset&quot; value=&quot;重置&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div class=&quot;output&quot;&amp;gt;
&amp;lt;?php
if(isset($_POST[&#039;SubmitButton&#039;]))
{
    $str = $_POST[&#039;text&#039;];
    echo md5($str);
}
?&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;后续问题&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;表单验证，JS端的验证，PHP端的验证&lt;/li&gt;
&lt;li&gt;刷新页面之后不会出现重新提交表单的情况&lt;/li&gt;
&lt;li&gt;是否能仅用JS来实现MD5计算&lt;/li&gt;
&lt;li&gt;页面更加美化和功能的增多&lt;/li&gt;
&lt;/ul&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8PHP%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%AE%A1%E7%AE%97%E5%AD%97%E7%AC%A6%E4%B8%B2MD5%E5%80%BC%E7%9A%84%E9%A1%B5%E9%9D%A2.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8PHP%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%AE%A1%E7%AE%97%E5%AD%97%E7%AC%A6%E4%B8%B2MD5%E5%80%BC%E7%9A%84%E9%A1%B5%E9%9D%A2.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>Debian系列发行版管理iptables</title>
            <description>
            &lt;!--
author: admin
date: 2019-03-24
title: Debian系列发行版管理iptables
tags: iptables
category: Linux
status: publish
summary: 请使用 Windows Server 保平安😭
--&gt;
&lt;h4&gt;Debian系列发行版管理iptables&lt;/h4&gt;
&lt;p&gt;RedHat系列下有比较好用的iptables管理工具，可以像控制服务进程一样来对防火墙进行管理及控制，Debian系发行版默认不开启iptables，当然也没有与之相关的能直接管理的工具了。 正常情况下，我们写入的iptables规则将会在系统重启时消失。&lt;/p&gt;
&lt;h4&gt;安装iptables并启用规则&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;apt-get update
apt-get install iptables -y

# 清除默认规则
iptables -F &amp;amp;&amp;amp; iptables -X &amp;amp;&amp;amp; iptables -Z

vim /etc/iptables.test.rules
#自定义规则
*filter
# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn&#039;t use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# You could modify this to only allow certain traffic
# Allows SSH connections from anywhere
-A INPUT -p tcp --dport 22 -j ACCEPT
# Open TCP port
-A INPUT -p tcp --dport xxxx -j ACCEPT
# Allows specify ip access to the specified port
-A INPUT -s 103.21.244.0/22 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -s 10.1.108.0/22 -p tcp -m multiport --dport 22,80,8080,6700:6704 -j ACCEPT
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# log iptables denied calls (access via &#039;dmesg&#039; command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix &quot;iptables denied: &quot; --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
# Allows all outbound traffic
-A OUTPUT -j ACCEPT
COMMIT

# 启用规则
iptables-restore &amp;lt; /etc/iptables.test.rules

# 查看规则是否生效
iptables -L&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在已经自定义好防火墙规则了，但是重启之后就会失效&lt;/p&gt;
&lt;p&gt;这里我们有一个更好的iptables持久化方案，让防火墙规则重启后依旧有效。即使用iptables-persistent工具。&lt;/p&gt;
&lt;h4&gt;使用iptables-persistent&lt;/h4&gt;
&lt;p&gt;安装&lt;/p&gt;
&lt;p&gt;&lt;code&gt;apt-get install iptables-persistent -y&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;iptables-persistent指令使用语法&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Ubuntu 14.04
/etc/init.d/netfilter-persistent {start|restart|reload|force-reload|save|flush}

# Ubuntu 16.04
/etc/init.d/netfilter-persistent {start|restart|reload|force-reload|save|flush}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完后即可使用以下命令保存或载入规则：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Ubuntu 14.04
/etc/init.d/iptables-persistent save
/etc/init.d/iptables-persistent reload

# Ubuntu 16.04
netfilter-persistent save
netfilter-persistent reload&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过iptables-persistent生成的规则默认将被存储在以下文件中，可随时查看&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/iptables/rules.v4&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/iptables/rules.v6&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;之后即使系统重启，iptables 规则也不会失效了。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://yq.aliyun.com/articles/535565&quot;&gt;Debian 使用 iptables-persistent 持久化 iptables 规则&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Debian%E7%B3%BB%E5%88%97%E5%8F%91%E8%A1%8C%E7%89%88%E7%AE%A1%E7%90%86iptables.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Debian%E7%B3%BB%E5%88%97%E5%8F%91%E8%A1%8C%E7%89%88%E7%AE%A1%E7%90%86iptables.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>使用PHP CodeIgniter 框架搭建一个简易的Blog</title>
            <description>
            &lt;!--
author: admin
date: 2019-03-14
title: 使用PHP CodeIgniter 框架搭建一个简易的Blog
tags: CodeIgniter,Blog
category: PHP
status: publish
summary: 使用PHP CodeIgniter 框架搭建一个简易的Blog
--&gt;
&lt;h3&gt;使用PHP CodeIgniter 框架搭建一个简易的Blog&lt;/h3&gt;
&lt;h4&gt;准备工作&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;php.ini&lt;/code&gt;配置文件中添加所在时区&lt;/p&gt;
&lt;p&gt;根据PHP开发规范，修改Visual Studio Code中行尾结束符为&lt;code&gt;\n&lt;/code&gt;，即 Unix 格式换行符（LF）&lt;/p&gt;
&lt;p&gt;下载 CodeIgniter 3.1.10 并解压到网站根目录，按照自己的信息来修改 &lt;code&gt;config.php&lt;/code&gt;，&lt;code&gt;database.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;下载Bootstrap到网站根目录（参考之前的文章）&lt;/p&gt;
&lt;p&gt;移除&lt;code&gt;index.php&lt;/code&gt;（请参考官方文档操作）&lt;/p&gt;
&lt;h4&gt;简单规划&lt;/h4&gt;
&lt;p&gt;分为两个类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Welcome&lt;/code&gt;类，用于浏览者访问使用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Admin&lt;/code&gt;类，用于管理员日常操作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Welcome&lt;/code&gt;类包含文章列表和文章查看等功能
&lt;code&gt;Admin&lt;/code&gt;类包含管理员登录，文章添加，文章修改和删除，账号的修改等功能&lt;/p&gt;
&lt;h4&gt;创建数据库类（Model）&lt;/h4&gt;
&lt;p&gt;在模型中创建两个函数来提供分页所需的数据，一个是文章总数，一个是查询一定范围的数据&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;/**
 * 查询总数
 */
public function post_counts()
{
    return $this-&amp;gt;db-&amp;gt;count_all(&#039;blog_main&#039;);
}

/**
 * 获取文章列表
 */
public function get_post_list($limit,$start)
{
    $this-&amp;gt;db-&amp;gt;limit($limit, $start);
    $query = $this-&amp;gt;db-&amp;gt;get(&#039;blog_main&#039;);

    if ($query-&amp;gt;num_rows() &amp;gt; 0)
    {
        foreach ($query-&amp;gt;result() as $row)
        {
            $data[] = $row;
        }
        return $data;
    }
    return FALSE;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;创建&lt;code&gt;Welcome&lt;/code&gt;类&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
// 防止非法访问当前的 PHP 文件
defined(&#039;BASEPATH&#039;) OR exit(&#039;No direct script access allowed&#039;);

class Welcome extends CI_Controller {
...
...
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;类名和类文件的命名规则应当一致，首字母大写，如有多个单词，使用下划线分割。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;构造函数&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function __construct()
{
    parent:: __construct();
    $this-&amp;gt;load-&amp;gt;helper(&quot;url&quot;);
    $this-&amp;gt;load-&amp;gt;library(&quot;pagination&quot;);
    $this-&amp;gt;load-&amp;gt;model(&#039;Blog_post_model&#039;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具有构造函数的类会在每次创建新对象时先调用此方法，非常适合在使用对象之前做一些初始化工作，在构造函数中加载的数据会在整个类中生效，不必在每个方法中再次加载。（更多关于构造函数的内容，请参考PHP官方文档及文末给出的参考资料）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;创建默认方法&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function index()
{       
    $config[&#039;base_url&#039;] = base_url() . &#039;index.php/welcome/index/&#039;;
    $config[&#039;total_rows&#039;] = $this-&amp;gt;Blog_post_model-&amp;gt;post_counts();
    $config[&#039;per_page&#039;] = 6;
    $config[&quot;uri_segment&quot;] = 3;
    $this-&amp;gt;pagination-&amp;gt;initialize($config);
    $page = ($this-&amp;gt;uri-&amp;gt;segment(3)) ? $this-&amp;gt;uri-&amp;gt;segment(3) : 0;      
    $result[&#039;results&#039;] = $this-&amp;gt;Blog_post_model-&amp;gt;get_post_list($config[&#039;per_page&#039;],$page);
    $result[&quot;links&quot;] = $this-&amp;gt;pagination-&amp;gt;create_links();       
    $this-&amp;gt;load-&amp;gt;view(&#039;welcome&#039;,$result);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;创建视图&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;创建模板&lt;/strong&gt;
将经常使用的静态HTML当作模板，降低代码重复度，方便调用。&lt;/p&gt;
&lt;p&gt;新建页头文件 application/views/templates/header.php 并添加以下代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;
        &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
        &amp;lt;title&amp;gt;博客&amp;lt;/title&amp;gt;
        &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;
        &amp;lt;link href=&quot;&amp;lt;?php echo base_url();?&amp;gt;static/css/bootstrap.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
        &amp;lt;link href=&quot;&amp;lt;?php echo base_url();?&amp;gt;static/css/style.css&quot; rel=&quot;stylesheet&quot;&amp;gt;    
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再新建个页脚文件 application/views/templates/footer.php ，然后添加以下代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;
    &amp;lt;script src=&quot;&amp;lt;?php echo base_url();?&amp;gt;static/jquery/jquery-3.3.1.js&quot;&amp;gt;&amp;lt;/script&amp;gt;   
    &amp;lt;script src=&quot;&amp;lt;?php echo base_url();?&amp;gt;static/js/bootstrap.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;&amp;lt;?php echo base_url();?&amp;gt;static/js/scripts.js&quot;&amp;gt;&amp;lt;/script&amp;gt;    
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;创建&lt;code&gt;welcome&lt;/code&gt;试图文件&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;div class=&quot;container-fluid header&quot;&amp;gt;
    &amp;lt;div class=&quot;row&quot;&amp;gt;
        &amp;lt;div class=&quot;col-md-12&quot;&amp;gt;
            &amp;lt;h2&amp;gt;
                博客
            &amp;lt;/h2&amp;gt;           
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;
    &amp;lt;div class=&quot;row&quot;&amp;gt;
        &amp;lt;div class=&quot;col-md-12&quot;&amp;gt;
            &amp;lt;?php foreach($results as $obj): ?&amp;gt;
            &amp;lt;div class=&quot;artList border shadow p-3 mb-5 bg-white rounded&quot;&amp;gt;
                &amp;lt;h3 style=&quot;margin-bottom:30px&quot;&amp;gt;
                    &amp;lt;a href=&quot;&amp;lt;?php echo site_url();?&amp;gt;/Welcome/browse_post/&amp;lt;?php echo $obj-&amp;gt;id;?&amp;gt;&quot;&amp;gt;&amp;lt;?php echo $obj-&amp;gt;title;?&amp;gt;&amp;lt;/a&amp;gt;
                &amp;lt;/h3&amp;gt;
                &amp;lt;p&amp;gt;
                    &amp;lt;?php                           
                        $data = $obj-&amp;gt;content;
                        $data=strip_tags($data);//去除html标记
                        $pattern = &quot;/&amp;amp;[a-zA-Z]+;/&quot;;//去除特殊符号
                        $data=preg_replace($pattern,&#039;&#039;,$data);
                        $data=mb_strimwidth($data,0,255,&quot;......&quot;);
                        echo $data;                         
                    ?&amp;gt;
                &amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;
                    &amp;lt;a href=&quot;&amp;lt;?php echo site_url();?&amp;gt;/main/conView/&amp;lt;?php echo $obj-&amp;gt;id;?&amp;gt;&quot;&amp;gt;阅读更多&amp;lt;/a&amp;gt;
                    &amp;lt;span class=&quot;float-right&quot;&amp;gt;更新时间：&amp;lt;?php echo date(&quot;Y-m-d&quot;,$obj-&amp;gt;create_time);?&amp;gt;&amp;lt;/span&amp;gt;
                &amp;lt;/p&amp;gt;                    
            &amp;lt;/div&amp;gt;              
            &amp;lt;?php endforeach; ?&amp;gt;            
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;  
    &amp;lt;?php echo $links ?&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;修改routes&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$route[&#039;default_controller&#039;] = &#039;Welcome&#039;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将默认控制器改成&lt;code&gt;Welcome&lt;/code&gt;，那么在浏览器中输入http://www.xxx.com时，CI框架会开始寻找&lt;code&gt;Welcome&lt;/code&gt;类，然后调用&lt;code&gt;index&lt;/code&gt;方法，&lt;code&gt;index&lt;/code&gt;方法会处理数据然后返回视图&lt;code&gt;welcome&lt;/code&gt;到浏览器。&lt;/p&gt;
&lt;p&gt;以上就是CI框架工作的大致流程。&lt;/p&gt;
&lt;h4&gt;文章详情页面&lt;/h4&gt;
&lt;p&gt;（未完待续）&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文参考：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/39525417/visual-studio-code-how-to-show-line-endings&quot;&gt;Visual Studio Code: How to show line endings&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/37622520/what-is-the-function-of-construct-in-codeigniter&quot;&gt;What is the function of __construct() in CodeIgniter?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://secure.php.net/manual/en/language.oop5.decon.php&quot;&gt;Constructors and Destructors&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8PHP_CodeIgniter_%E6%A1%86%E6%9E%B6%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%AE%80%E6%98%93%E7%9A%84Blog.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8PHP_CodeIgniter_%E6%A1%86%E6%9E%B6%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%AE%80%E6%98%93%E7%9A%84Blog.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>PHP 开发规范(CodeIgniter 开发规范)</title>
            <description>
            &lt;!--
author: CodeIgniter中文社区
date: 2019-03-11
title: PHP 开发规范(CodeIgniter 开发规范)
tags: CodeIgniter
category: 转载
status: publish
summary: 本文是从CodeIgniter中文社区转载过来的,方便自己查询。
--&gt;
&lt;h4&gt;PHP 开发规范(CodeIgniter 开发规范)&lt;/h4&gt;
&lt;h4&gt;文件格式&lt;/h4&gt;
&lt;p&gt;文件应该保存为 Unicode（UTF-8）编码格式，不要使用 字节序标记（BOM），和 UTF-16 和 UTF-32 不一样， UTF-8 编码格式的文件不需要指定字节序。而且 BOM 会在 PHP 的输出中产生副作用， 它会阻止应用程序设置它的头信息。另外，所有的换行符应该使用 Unix 格式换行符（LF）。&lt;/p&gt;
&lt;h4&gt;PHP 结束标签&lt;/h4&gt;
&lt;p&gt;PHP 结束标签 ?&amp;gt; 对于 PHP 解析器来说是可选的，但是只要使用了，结束标签之后的空格 有可能会导致不想要的输出，这个空格可能是由开发者或者用户又或者 FTP 应用程序引入的， 甚至可能导致出现 PHP 错误，如果配置了不显示 PHP 错误，就会出现空白页面。基于这个原因， 所有的 PHP 文件将不使用结束标签，而是以一个空行代替。&lt;/p&gt;
&lt;h4&gt;文件的命名&lt;/h4&gt;
&lt;p&gt;类文件的命名必须以大写字母开头，其他文件（配置文件，视图，一般的脚本文件等）的命名是全小写。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;somelibrary.php
someLibrary.php
SOMELIBRARY.php
Some_Library.php

Application_config.php
Application_Config.php
applicationConfig.php&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;Somelibrary.php
Some_library.php

applicationconfig.php
application_config.php&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外，类文件的名称必须和类的名称保持一致，例如，如果你有一个类名为 Myclass ， 那么文件名应该是 Myclass.php 。&lt;/p&gt;
&lt;h4&gt;类和方法的命名&lt;/h4&gt;
&lt;p&gt;类名必须以大写字母开头，多个单词之间使用下划线分割，不要使用驼峰命名法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class superclass
class SuperClass&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Super_class

class Super_class {

    public function __construct()
    {

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;类的方法应该使用全小写，并且应该明确指出该方法的功能，最好包含一个动词。 避免使用冗长的名称，多个单词之间使用下划线分割。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function fileproperties();       // not descriptive and needs underscore separator;
function fileProperties();       // not descriptive and uses CamelCase
function getfileproperties();        // Better!  But still missing underscore separator;
function getFileProperties();        // uses CamelCase
function get_the_file_properties_from_the_file();    // wordy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function get_file_properties();  // descriptive, underscore separator, and all lowercase letters&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;变量的命名&lt;/h4&gt;
&lt;p&gt;变量的命名规则和类方法的命名规则非常接近，使用全小写，使用下划线分割， 并且应该明确指出该变量的用途。非常短的无意义的变量只应该在 for 循环中作为迭代器使用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$j = &#039;foo&#039;;     // single letter variables should only be used in for() loops
$Str            // contains uppercase letters
$bufferedText       // uses CamelCasing, and could be shortened without losing semantic meaning
$groupid        // multiple words, needs underscore separator
$name_of_last_city_used // too long&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;for ($j = 0; $j &amp;lt; 10; $j++)
$str
$buffer
$group_id
$last_city&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;注释&lt;/h4&gt;
&lt;p&gt;通常情况下，应该多写点注释，这不仅可以向那些缺乏经验的程序员描述代码的流程和意图， 而且当你几个月后再回过头来看自己的代码时仍能帮你很好的理解。 注释并没有强制规定的格式，但是我们建议以下的形式。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_phpDocumentor.howto.pkg.html#basics.docblock&quot;&gt;DocBlock&lt;/a&gt;风格的注释，写在类、方法和属性定义的前面，可以被 IDE 识别:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;/**
 * Super Class
 *
 * @package Package Name
 * @subpackage  Subpackage
 * @category    Category
 * @author  Author Name
 * @link    http://example.com
 */
class Super_class {&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;/**
 * Encodes string for use in XML
 *
 * @param   string  $str    Input string
 * @return  string
 */
function xml_encode($str)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;/**
 * Data for class manipulation
 *
 * @var array
 */
public $data = array();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;单行注释应该和代码合在一起，大块的注释和代码之间应该留一个空行。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// break up the string by newlines
$parts = explode(&quot;\n&quot;, $str);

// A longer comment that needs to give greater detail on what is
// occurring and why can use multiple single-line comments.  Try to
// keep the width reasonable, around 70 characters is the easiest to
// read.  Don&#039;t hesitate to link to permanent external resources
// that may provide greater detail:
//
// http://example.com/information_about_something/in_particular/

$parts = $this-&amp;gt;foo($parts);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;常量&lt;/h4&gt;
&lt;p&gt;常量遵循和变量一样的命名规则，除了它需要全部大写。&lt;strong&gt;尽量使用 CodeIgniter 已经定义好的常量， 如：SLASH、LD、RD、PATH_CACHE 等&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;myConstant  // missing underscore separator and not fully uppercase
N       // no single-letter constants
S_C_VER     // not descriptive
$str = str_replace(&#039;{foo}&#039;, &#039;bar&#039;, $str);   // should use LD and RD constants&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;MY_CONSTANT
NEWLINE
SUPER_CLASS_VERSION
$str = str_replace(LD.&#039;foo&#039;.RD, &#039;bar&#039;, $str);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;TRUE、FALSE 和 NULL&lt;/h4&gt;
&lt;p&gt;TRUE 、 FALSE 和 NULL 这几个关键字全部使用大写。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if ($foo == true)
$bar = false;
function foo($bar = null)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if ($foo == TRUE)
$bar = FALSE;
function foo($bar = NULL)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;逻辑操作符&lt;/h4&gt;
&lt;p&gt;不要使用&lt;code&gt;||&lt;/code&gt;操作符，它在一些设备上看不清（可能看起来像是数字 11）， 使用 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 操作符比使用 &lt;code&gt;AND&lt;/code&gt; 要好一点，但是两者都可以接受。 另外，在 ! 操作符的前后都应该加一个空格。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if ($foo || $bar)
if ($foo AND $bar)  // okay but not recommended for common syntax highlighting applications
if (!$foo)
if (! is_array($foo))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if ($foo OR $bar)
if ($foo &amp;amp;&amp;amp; $bar) // recommended
if ( ! $foo)
if ( ! is_array($foo))&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;对返回值进行比较以及类型转换&lt;/h4&gt;
&lt;p&gt;有一些 PHP 函数在失败时返回 FALSE ，但是也可能会返回 &amp;quot;&amp;quot; 或 0 这样的有效值， 这些值在松散类型比较时和 FALSE 是相等的。所以当你在条件中使用这些返回值作比较时， 一定要使用严格类型比较，确保返回值确实是你想要的，而不是松散类型的其他值。&lt;/p&gt;
&lt;p&gt;在检查你自己的返回值和变量时也要遵循这种严格的方式，必要时使用 &lt;code&gt;===&lt;/code&gt; 和 &lt;code&gt;!==&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// If &#039;foo&#039; is at the beginning of the string, strpos will return a 0,
// resulting in this conditional evaluating as TRUE
if (strpos($str, &#039;foo&#039;) == FALSE)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if (strpos($str, &#039;foo&#039;) === FALSE)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function build_string($str = &quot;&quot;)
{
    if ($str == &quot;&quot;) // uh-oh!  What if FALSE or the integer 0 is passed as an argument?
    {

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function build_string($str = &quot;&quot;)
{
    if ($str === &quot;&quot;)
    {

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外关于 类型转换 的信息也将很有用。 类型转换会对变量产生一点轻微的影响，但可能也是期望的。例如 NULL 和 布尔值 FALSE 会转换为空字符串， 数字 0 （和其他数字）将会转换为数字字符串，布尔值 TRUE 会变成 &amp;quot;1&amp;quot;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$str = (string) $str; // cast $str as a string&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;调试代码&lt;/h4&gt;
&lt;p&gt;不要在你的提交中包含调试代码，就算是注释掉了也不行。 像 &lt;code&gt;var_dump()&lt;/code&gt;、 &lt;code&gt;print_r()&lt;/code&gt; 、 &lt;code&gt;die()&lt;/code&gt; 和 &lt;code&gt;exit()&lt;/code&gt; 这样的函数，都不应该包含在你的代码里， 除非它们用于除调试之外的其他特殊用途。&lt;/p&gt;
&lt;h4&gt;文件中的空格&lt;/h4&gt;
&lt;p&gt;PHP 起始标签的前面和结束标签的后面都不要留空格，输出是被缓存的，所以如果你的文件中有空格的话， 这些空格会在 CodeIgniter 输出它的内容之前被输出，从而会导致错误，而且也会导致 CodeIgniter 无法发送正确的头信息。&lt;/p&gt;
&lt;h4&gt;兼容性&lt;/h4&gt;
&lt;p&gt;CodeIgniter 推荐使用 PHP 5.6 或更新版本，但是它还得同时兼容 PHP 5.3.7。 你的代码要么提供适当的回退来兼容这点，要么提供一些可选的功能，当不兼容时能安静的退出而不影响用户的程序。&lt;/p&gt;
&lt;p&gt;另外，不要使用那些需要额外安装的库的 PHP 函数，除非你能给出当该函数不存在时，有其他的函数能替代它。&lt;/p&gt;
&lt;h4&gt;一个类一个文件&lt;/h4&gt;
&lt;p&gt;除非几个类是&lt;strong&gt;紧密相关的&lt;/strong&gt;，否则每个类应该单独使用一个文件。 在 CodeIgniter 中一个文件包含多个类的一个例子是 Xmlrpc 类文件。&lt;/p&gt;
&lt;h4&gt;空格&lt;/h4&gt;
&lt;p&gt;在代码中使用制表符（&lt;kbd&gt;Tab&lt;/kbd&gt;）来代替空格，这虽然看起来是一件小事，但是使用制表符代替空格， 可以让开发者阅读你代码的时候，可以根据他们的喜好在他们的程序中自定义缩进。 此外还有一个好处是，这样文件可以更紧凑一点，也就是本来是四个空格字符， 现在只要一个制表符就可以了。&lt;/p&gt;
&lt;h4&gt;换行&lt;/h4&gt;
&lt;p&gt;文件必须使用 Unix 的换行格式保存。这对于那些在 Windows 环境下的开发者可能是个问题， 但是不管在什么环境下，你都应该确认下你的文本编辑器已经配置好使用 Unix 换行符了。&lt;/p&gt;
&lt;h4&gt;代码缩进&lt;/h4&gt;
&lt;p&gt;使用 Allman 代码缩进风格。除了类的定义之外，其他的所有大括号都应该独占一行， 并且和它对应的控制语句保持相同的缩进。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function foo($bar) {
    // ...
}

foreach ($arr as $key =&amp;gt; $val) {
    // ...
}

if ($foo == $bar) {
    // ...
} else {
    // ...
}

for ($i = 0; $i &amp;lt; 10; $i++)
    {
    for ($j = 0; $j &amp;lt; 10; $j++)
        {
        // ...
        }
    }

try {
    // ...
}
catch() {
    // ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function foo($bar)
{
    // ...
}

foreach ($arr as $key =&amp;gt; $val)
{
    // ...
}

if ($foo == $bar)
{
    // ...
}
else
{
    // ...
}

for ($i = 0; $i &amp;lt; 10; $i++)
{
    for ($j = 0; $j &amp;lt; 10; $j++)
    {
        // ...
    }
}

try
{
    // ...
}
catch()
{
    // ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;中括号和小括号内的空格&lt;/h4&gt;
&lt;p&gt;一般情况下，使用中括号和小括号的时候不应该使用多余的空格。 唯一的例外是，在那些接受一个括号和参数的 PHP 的控制结构（declare、do-while、elseif、for、 foreach、if、switch、while）的后面应该加一个空格，这样做可以和函数区分开来，并增加可读性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$arr[ $foo ] = &#039;foo&#039;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$arr[$foo] = &#039;foo&#039;; // no spaces around array keys&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function foo ( $bar )
{

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function foo($bar) // no spaces around parenthesis in function declarations
{

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;foreach( $query-&amp;gt;result() as $row )&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;foreach ($query-&amp;gt;result() as $row) // single space following PHP control structures, but not in interior parenthesis&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;本地化文本&lt;/h4&gt;
&lt;p&gt;CodeIgniter 的类库应该尽可能的使用相应的语言文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;return &quot;Invalid Selection&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;return $this-&amp;gt;lang-&amp;gt;line(&#039;invalid_selection&#039;);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;私有方法和变量&lt;/h4&gt;
&lt;p&gt;那些只能在内部访问的方法和变量，例如供共有方法使用的那些工具方法或辅助函数，应该以下划线开头。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function convert_text()
private function _convert_text()&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;PHP 错误&lt;/h4&gt;
&lt;p&gt;运行代码时不应该出现任何错误信息，并不是把警告和提示信息关掉来满足这一点。 例如，绝不要直接访问一个你没设置过的变量（例如，&lt;code&gt;$_POST&lt;/code&gt; 数组）， 你应该先使用 &lt;code&gt;isset()&lt;/code&gt; 函数判断下。&lt;/p&gt;
&lt;p&gt;确保你的开发环境对所有人都开启了错误报告，PHP 环境的 display_errors 参数也开启了， 你可以通过下面的代码来检查:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if (ini_get(&#039;display_errors&#039;) == 1)
{
    exit &quot;Enabled&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有些服务器上 &lt;code&gt;display_errors&lt;/code&gt; 参数可能是禁用的，而且你没有权限修改 &lt;code&gt;php.ini&lt;/code&gt; 文件， 你可以使用下面的方法来启用它:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;ini_set(&#039;display_errors&#039;, 1);&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注解
使用 &lt;code&gt;ini_set()&lt;/code&gt;函数在运行时设置 &lt;code&gt;display_errors&lt;/code&gt; 参数和通过 &lt;code&gt;php.ini&lt;/code&gt; 配置文件来设置是不一样的，换句话说，当出现致命错误（&lt;code&gt;fatal errors&lt;/code&gt;）时，这种方法没用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;短标记&lt;/h4&gt;
&lt;p&gt;使用 PHP 的完整标记，防止服务器不支持短标记（ short_open_tag ）参数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;? echo $foo; ?&amp;gt;

&amp;lt;?=$foo?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php echo $foo; ?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注解
PHP 5.4 下 &amp;lt;?= 标记是永远可用的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;每行只有一条语句&lt;/h4&gt;
&lt;p&gt;切记不要在同一行内写多条语句。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$foo = &#039;this&#039;; $bar = &#039;that&#039;; $bat = str_replace($foo, $bar, $bag);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$foo = &#039;this&#039;;
$bar = &#039;that&#039;;
$bat = str_replace($foo, $bar, $bag);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;字符串&lt;/h4&gt;
&lt;p&gt;字符串使用单引号引起来，当字符串中有变量时使用双引号，并且使用大括号将变量包起来。 另外，当字符串中有单引号时，也应该使用双引号，这样就不用使用转义符。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&quot;My String&quot;                 // no variable parsing, so no use for double quotes
&quot;My string $foo&quot;                // needs braces
&#039;SELECT foo FROM bar WHERE baz = \&#039;bag\&#039;&#039;   // ugly&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&#039;My String&#039;
&quot;My string {$foo}&quot;
&quot;SELECT foo FROM bar WHERE baz = &#039;bag&#039;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;SQL 查询&lt;/h4&gt;
&lt;p&gt;SQL 关键字永远使用大写：&lt;code&gt;SELECT&lt;/code&gt;、&lt;code&gt;INSERT&lt;/code&gt;、&lt;code&gt;UPDATE&lt;/code&gt;、&lt;code&gt;WHERE&lt;/code&gt;、&lt;code&gt;AS&lt;/code&gt;、&lt;code&gt;JOIN&lt;/code&gt;、&lt;code&gt;ON&lt;/code&gt;、&lt;code&gt;IN&lt;/code&gt; 等。&lt;/p&gt;
&lt;p&gt;考虑到易读性，把长的查询分成多行，最好是每行只有一个从句或子从句。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;错误的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// keywords are lowercase and query is too long for
// a single line (... indicates continuation of line)
$query = $this-&amp;gt;db-&amp;gt;query(&quot;select foo, bar, baz, foofoo, foobar as raboof, foobaz from exp_pre_email_addresses
...where foo != &#039;oof&#039; and baz != &#039;zab&#039; order by foobaz limit 5, 100&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正确的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$query = $this-&amp;gt;db-&amp;gt;query(&quot;SELECT foo, bar, baz, foofoo, foobar AS raboof, foobaz
                FROM exp_pre_email_addresses
                WHERE foo != &#039;oof&#039;
                AND baz != &#039;zab&#039;
                ORDER BY foobaz
                LIMIT 5, 100&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;缺省的函数参数&lt;/h4&gt;
&lt;p&gt;适当的时候，提供函数参数的缺省值，这有助于防止因错误的函数调用引起的PHP错误， 另外提供常见的备选值可以节省几行代码。例如:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function foo($bar = &#039;&#039;, $baz = FALSE)&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：
&lt;a href=&quot;https://codeigniter.org.cn/user_guide/general/styleguide.html&quot;&gt;PHP 开发规范&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/PHP_%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83_CodeIgniter_%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/PHP_%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83_CodeIgniter_%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>PHP CI 分页之Bootstrap</title>
            <description>
            &lt;!--
author: admin
date: 2019-03-08
title: PHP CI 分页之Bootstrap
tags: CodeIgniter,Bootstrap
category: PHP
status: publish
summary: 继续学习CodeIgniter分页类
--&gt;
&lt;h4&gt;PHP CI 分页之Bootstrap&lt;/h4&gt;
&lt;p&gt;之前的文章只是简单的使用CI框架生成一个分页，没有CSS，JS等，本文将在之前的基础上再添加Bootstrap对分页进行构建&lt;/p&gt;
&lt;p&gt;本文使用Bootstap 4.3.1 &lt;/p&gt;
&lt;h4&gt;准备工作&lt;/h4&gt;
&lt;p&gt;下载以下工具
&lt;a href=&quot;https://github.com/twbs/bootstrap/releases/download/v4.3.1/bootstrap-4.3.1-dist.zip&quot;&gt;Bootstrap v4.3.1&lt;/a&gt;
&lt;a href=&quot;https://code.jquery.com/jquery-3.3.1.js&quot;&gt;jQuery v3.3.1&lt;/a&gt;
&lt;del&gt;&lt;a href=&quot;https://unpkg.com/popper.js@1.14.7/dist/umd/popper.js&quot;&gt;Popper.js v1.14.7&lt;/a&gt;&lt;/del&gt; (bootstrap.bundle.js已经包含)&lt;/p&gt;
&lt;p&gt;在网站根目录下创建&lt;code&gt;static&lt;/code&gt;目录，将下载的工具放到此目录下，结构&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static
  |
  |
  |---css
  |    |
  |    |--bootstrap.css
  |     
  |---js
  |    |
  |    |---bootstrap.bundle.js
  |    |---bootstrap.js
  |
  |---jquery
        |
        |---jquery-3.3.1.js&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;在页面中使用Bootstrap&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;head&lt;/code&gt;标签中添加&lt;code&gt;CSS&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-htmlbars&quot;&gt;&amp;lt;head&amp;gt;
...
&amp;lt;link href=&quot;&amp;lt;?php echo base_url();?&amp;gt;static/css/bootstrap.css&quot; rel=&quot;stylesheet&quot;&amp;gt;

&amp;lt;!--自定义的CSS--&amp;gt;
&amp;lt;link href=&quot;&amp;lt;?php echo base_url();?&amp;gt;static/css/style.css&quot; rel=&quot;stylesheet&quot;&amp;gt;
...
&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在页面最后&lt;code&gt;body&lt;/code&gt;标签之前添加&lt;code&gt;JS&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-htmlbars&quot;&gt;...
&amp;lt;script src=&quot;&amp;lt;?php echo base_url();?&amp;gt;static/jquery/jquery-3.3.1.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;&amp;lt;?php echo base_url();?&amp;gt;static/js/bootstrap.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;!--自定义的JS--&amp;gt;
&amp;lt;script src=&quot;&amp;lt;?php echo base_url();?&amp;gt;static/js/scripts.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;添加样式&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Container容器&lt;/strong&gt;
Container容器是窗口布局的最基本元素，我们推荐所有样式都定义在&lt;code&gt;.container&lt;/code&gt;或&lt;code&gt;.container-fluid&lt;/code&gt;容器之中-- 这是启用整个栅格系统必不可少的前置条件，它们分别对应选择一个响应式的、固定宽度的容器，或者选择一个流式自适应浏览器或容器最大合法宽度的窗口（意味着任何时候它的宽度总是100%）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.container&lt;/code&gt;容器可以被嵌套，但是大多数布局并不需要这么做（最少层次的嵌套构建出的网页更优雅-译者注），其呈现效果和使用方法如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1551753358717.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-htmlbars&quot;&gt;&amp;lt;div class=&quot;container&quot;&amp;gt;
  &amp;lt;!-- Content here --&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Border&lt;/strong&gt;
使用 &lt;code&gt;border&lt;/code&gt;快速定义边框和边框阴影和边框圆角
示例：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1551754991895.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-htmlbars&quot;&gt;&amp;lt;span class=&quot;border&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;border-top&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;border-right&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;border-bottom&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;border-left&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Border-radius&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1551755160727.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-htmlbars&quot;&gt;&amp;lt;img src=&quot;...&quot; alt=&quot;...&quot; class=&quot;rounded&quot;&amp;gt;
&amp;lt;img src=&quot;...&quot; alt=&quot;...&quot; class=&quot;rounded-top&quot;&amp;gt;
&amp;lt;img src=&quot;...&quot; alt=&quot;...&quot; class=&quot;rounded-right&quot;&amp;gt;
&amp;lt;img src=&quot;...&quot; alt=&quot;...&quot; class=&quot;rounded-bottom&quot;&amp;gt;
&amp;lt;img src=&quot;...&quot; alt=&quot;...&quot; class=&quot;rounded-left&quot;&amp;gt;
&amp;lt;img src=&quot;...&quot; alt=&quot;...&quot; class=&quot;rounded-circle&quot;&amp;gt;
&amp;lt;img src=&quot;...&quot; alt=&quot;...&quot; class=&quot;rounded-0&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Shadow&lt;/strong&gt;
使用&lt;code&gt;shadow&lt;/code&gt;快速定义阴影
示例：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1551755027796.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-htmlbars&quot;&gt;&amp;lt;div class=&quot;shadow-none p-3 mb-5 bg-light rounded&quot;&amp;gt;No shadow&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;shadow-sm p-3 mb-5 bg-white rounded&quot;&amp;gt;Small shadow&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;shadow p-3 mb-5 bg-white rounded&quot;&amp;gt;Regular shadow&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;shadow-lg p-3 mb-5 bg-white rounded&quot;&amp;gt;Larger shadow&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Hoverable rows&lt;/strong&gt;
使用&lt;code&gt;table-hover&lt;/code&gt;来定义行悬浮样式
示例：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1551775888912.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-htmlbars&quot;&gt;&amp;lt;table class=&quot;table table-hover&quot;&amp;gt;
  &amp;lt;thead&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th scope=&quot;col&quot;&amp;gt;#&amp;lt;/th&amp;gt;
      &amp;lt;th scope=&quot;col&quot;&amp;gt;First&amp;lt;/th&amp;gt;
      &amp;lt;th scope=&quot;col&quot;&amp;gt;Last&amp;lt;/th&amp;gt;
      &amp;lt;th scope=&quot;col&quot;&amp;gt;Handle&amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;
  &amp;lt;/thead&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上就是针对表格的整体显示样式，最终的效果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1551776040880.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;CI Pagination 类配置&lt;/h4&gt;
&lt;p&gt;详细资料请参考中文官方文档：&lt;a href=&quot;https://codeigniter.org.cn/user_guide/libraries/pagination.html#id6&quot;&gt;分页类&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// Bootstrap 分页样式
$config[&#039;full_tag_open&#039;] = &#039;&amp;lt;div&amp;gt;&amp;lt;ul class=&quot;pagination justify-content-center&quot;&amp;gt;&#039;;
$config[&#039;full_tag_close&#039;] = &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;
$config[&#039;first_tag_open&#039;] = &#039;&amp;lt;li class=&quot;page-item&quot;&amp;gt;&#039;;
$config[&#039;first_tag_close&#039;] = &#039;&amp;lt;/li&amp;gt;&#039;;
$config[&#039;last_tag_open&#039;] = &#039;&amp;lt;li class=&quot;page-item&quot;&amp;gt;&#039;;
$config[&#039;last_tag_close&#039;] = &#039;&amp;lt;/li&amp;gt;&#039;;
$config[&#039;num_tag_open&#039;] = &#039;&amp;lt;li class=&quot;page-item&quot;&amp;gt;&#039;;
$config[&#039;num_tag_close&#039;] = &#039;&amp;lt;/li&amp;gt;&#039;;
$config[&#039;prev_tag_open&#039;] = &#039;&amp;lt;li class=&quot;page-item&quot;&amp;gt;&#039;;
$config[&#039;prev_tag_close&#039;] = &#039;&amp;lt;/li&amp;gt;&#039;;
$config[&#039;next_tag_open&#039;] = &#039;&amp;lt;li class=&quot;page-item&quot;&amp;gt;&#039;;
$config[&#039;next_tag_close&#039;] = &#039;&amp;lt;/li&amp;gt;&#039;;
$config[&#039;cur_tag_open&#039;] = &#039;&amp;lt;li class=&quot;page-item active&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot;&amp;gt;&#039;;
$config[&#039;cur_tag_close&#039;] = &#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&#039;;
$config[&#039;attributes&#039;] = array(&#039;class&#039; =&amp;gt; &#039;page-link&#039;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中有两个地方要注意：
一个是，&lt;code&gt;justify-content-center&lt;/code&gt;，因为Bootstrap默认的分页样式是左对齐的，需要添加这个来使内容居中，也就是整个分页部分居中。另一个是，&lt;code&gt;$config[&#039;cur_tag_open&#039;] = &#039;&amp;lt;li class=&quot;page-item active&quot;&amp;gt;&amp;lt;a class=&quot;page-link&quot; href=&quot;#&quot;&amp;gt;&#039;;&lt;/code&gt;，因为CI框架在生成分页的时候，当前页是没有&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;标签的，只有&lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt;，所以要构建一个&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;标签&lt;/p&gt;
&lt;h4&gt;最终的显示&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./img/1552007195931.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/PHP_CI_%E5%88%86%E9%A1%B5%E4%B9%8BBootstrap.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/PHP_CI_%E5%88%86%E9%A1%B5%E4%B9%8BBootstrap.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>为什么人生是没有意义的</title>
            <description>
            &lt;!--
author: Jade
date: 2019-03-07
title: 为什么人生是没有意义的
tags: 哲学,思考
category: 转载
status: publish
summary: 因为一些个人经历的原因,从初中开始就不断陷入了思考人生意义的循环中,愿从这篇文章能得到一丝解脱。
--&gt;
&lt;h4&gt;为什么人生是没有意义的&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;引言&lt;/strong&gt; 我触碰了一个艰难而敏感的话题。可我别无选择，必须面对它。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;哲学与科学里的很多问题的解决，都是依靠推翻问题，而不是寻找答案。比如争论了几个世纪的世界的“绝对真理”，到了黑格尔那，直接否定了把世界与自我分离的二元论，提出万事万物是变化的，主体和客体是统一的，而我们对世界的认识只是相对的。再到后来的实用主义，存在主义，直接把寻找真理的意义也毁灭了。这颇有些像狭义相对论和量子力学，当经典物理穷尽了观测手段去研究被观测对象而不得，我们突然发现自己忘了，观测者也是系统中的一部分，我们的研究对象也许应该是薛定谔与猫，而不是薛定谔的猫。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人生到底有没有意义，人生的意义是什么，说的轻松一点，是每一个人都想过的问题，严重一点，是一个不得不思考的终极问题。但为什么说人生是没有意义的呢？我认为在于“意义”的定义。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;所谓意义，说白了是给自己的”某种解释“。&lt;/strong&gt;不管是观察和探究世界的自然规律，还是不屈不挠地试图推测人类认识范围之外的宇宙疆域，意识层级，神，高我，光，多维空间，等等，都是为了回答一个朴素的问题，人为什么活着？&lt;/p&gt;
&lt;p&gt;无论这个答案是什么，它的目的是让你自己感觉“找到答案”，找回安全感和内心的宁静。那么这时我们陷入了一个悖论：如果你找到了”人生的意义“，但它是只适用于你个人的，那么它更像一种为自己找到的理由，并不具有普世价值，也不能被检验。比如，很多很有母爱的妈妈会觉得，我活着就是为了我的孩子，我的家庭，这就是我的人生意义。那没有孩子的人就不适用这个答案。就算有，他们也不一定认可这个答案，因为也有很多人觉得，我的人生不是为了他人而活。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.syuez.com/blog/img/1551794102909.gif&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;想要骑到山川湖海，没想到半路爆胎&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;那么有没有可能，我们找到适用于所有人的，像绝对真理一样的”人生意义“呢？&lt;/strong&gt;过去几千年的哲学发展告诉我们，不能。而科学思维解释了”不能“的本质，因为它是无法被证伪的。”意义“是一个只存在于主观认知里的概念。我们需要它，是因为小我做任何事都要依靠目的，抓着不放。比如我们工作，是为了赚钱。赚钱，是为了买这个买那个。而买任何东西，也都有它特定的目的。没有了目的，我们的大脑无法理性支配我们的行动。可是既然是主观概念，那它就像念头，思想，感情一样，没有对错，只有是否相信。&lt;/p&gt;
&lt;p&gt;就算现在全世界几十亿人统一口径说，人生的意义就是 xxx，那也是无法被检验，无法被证伪的。一个不能公开检验，不能证伪的东西，就是宗教，就是不可知。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;还有一个大 bug，就是如果人生是有意义的，那么现代科学启发我们，这个意义应该是变化的，而不是静止的。&lt;/strong&gt;万事万物都在不断变化之中，包括人类生存的环境，地球在宇宙中的环境，还有我们对世界的认识。曾经几次打碎了哲学某时期的辉煌的，不是新的思想，而是新的科学发现。当达尔文发现了人的祖先是猿，严重地冲击了基督教的地位，不亚于日心说的发现。而当非欧几何，高斯临死都不敢发表的证明，被多年后爱因斯坦的相对论验证的时候，简直彻底击垮了理性哲学的根基，先验真理全都变成了先验假设。在此之前，没人能想象两条平行线为什么可以相交。&lt;/p&gt;
&lt;p&gt;既然世界都是变化的，人类，和人的个体也是，那就很难有恒常的意义。可是在我们的基因深处，总是倾向于从无序中寻找有序，从无规则运动中寻找规律。近代哲学发展到萨特，加缪，竟然又绕回了笛卡尔的“我思故我在”，就是说除了“我存在”这件事情之外，其实什么都是不确定的，也不可知的。除此之外，所有的理性结论都只是在一次次地被推倒重来。&lt;/p&gt;
&lt;p&gt;近几百年，我们经历的是科学的高速发展和哲学，思想史的近乎停滞。有很多人觉得，我们对人为什么活着这类终极问题的思考，远远比不上古人智慧。可我觉得，哲学的地位依然是至高无上的。因为所有聪明的人，自我实现了的人，有好奇心的人，觉醒的人，到最后都不得不继续追问同样的人生意义问题。人类生生不息，百折不挠地对这个问题发问，不会是徒劳的。至少它代表了一种尊严和精神。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.syuez.com/blog/img/1551794274344.gif&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;别人工作是为了生活，而我是为了生发&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;那么这种尊严如何体现呢？人类的哲思就要面临永远的停滞吗？我们注定要么狂妄愚蠢，要么绝望悲观吗？我们是否就要放弃对这个问题答案的寻找呢？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在刚才的推理里，我偷偷掩藏了一个逻辑漏洞。我刚才说，如果我们找到的某种意义是属于个体的，这个答案恐怕并没有普世价值，也没有解决终极问题。但这句话本身也不完全正确。归根结底还是取决于你如何定义“意义”。如果每个人心中都有一个能自圆其说的“人生意义”，就像一千个不同的哈姆雷特一样，那有何不可呢？这不是很好吗？&lt;/p&gt;
&lt;p&gt;所以我们这些无神论者，有时候会去羡慕有宗教信仰的人。尽管没有人知道上帝是否真的存在，但他们的人生更可能过得充实，积极，有安全感。我们也羡慕傻子，因为他们根本不用去想这个问题。所以古希腊哲人有一句话，&lt;strong&gt;因为无知，所以相信&lt;/strong&gt;。就是因为你不知道一个东西，所以你才有资格去相信他。如果你“知道”了，那就不叫相信。就像有人会说，我相信中医。那是因为中医还没有被很好地证明。&lt;/p&gt;
&lt;p&gt;哲学家们曾经最大的野心，是试图将人生意义这个课题，像数学一样，用严密的逻辑推演出一个终极结果，或一套完整的理论体系。发展到罗素，甚至尝试尽量去减少文字的使用以避免模糊不清，改用简洁的数学符号。可是最后，仗剑少年们通通失败了。波普尔最后一针见血地指出，有没有可能是因为，理性不是万能的，理性也有边界，它的极限无法超越我们想解决的问题？&lt;/p&gt;
&lt;p&gt;那么这时候，虽然我们不希望哲学变成宗教，变成与科学对立，变成丧失理性，但是我们不得不捡起人性中与逻辑和理性互补的一面，比如艺术，文学，信仰，尊严，真，善，美。&lt;/p&gt;
&lt;p&gt;加缪说，人生是没有意义的，荒谬的。他的整本《局外人》都在描述外部社会之于一个活着的人的荒谬之处。可是，他又写了一本《西西弗的神话》，说虽然每个人都像西西弗，周而复始地重复着无意义的动作，但是人把石头推上山的能动性，就是人性的光辉，就是人存在的“意义”，如果你非要找一个的话。&lt;/p&gt;
&lt;p&gt;所以，先别放弃。&lt;/p&gt;
&lt;p&gt;另外一个逻辑漏洞，是我说万事万物都是变化的。在这个角度上，科学并不是什么真理，而是“适应某个历史阶段的最有可能正确的”理论而已。&lt;strong&gt;但是，有没有东西是不变的呢？其实有，比如死亡。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我的母亲是一个哲学教授。我记得很小的时候有一次问她，人为什么要死呢？如果人不会死，那哲学会是什么样子的？具体的答案不记得了，只记得她的第一句话是，如果没有死亡，就不会有哲学，甚至很可能不会有大部分现在人类的文明。死亡是一个礼物，是它迫使人去思考，去创造。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;加缪有个理论，他说真正的哲学问题只有一个，就是自杀。&lt;/strong&gt;与其问你人为什么而活，我也可以问，你为什么不自杀呢？你不自杀的理由，是否就是你自己的人生意义？&lt;/p&gt;
&lt;p&gt;当然你也可以说，人有可能永生，比如把大脑送上三体的云天明，比如以后 neuroscience 也许能把人的大脑和记忆都上载，然后永远留在二进制的世界里。先不讨论那样还算不算人，但就时间来看，“很久”和“永远”还是有本质的区别。《三体》中最后的人类文明历史，是刻在石头上的，因为连芯片都保存不了那么长时间。而且，“死亡”的定义本来就不是绝对的。一个还有呼吸，但已经脑死亡的病人，是不是还算活着？人一生下来，就在不断地接近死亡。很多人怕老，比怕死更甚。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.syuez.com/blog/img/1551794714931.gif&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;梦想成为达芬奇，我却只画小猪佩奇&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;所以也许我们也可以说，不变的不是死亡，不变的是变化。&lt;/strong&gt;如果我们可以 100% 确定，没有任何事物是不变的，那这个结论本身就是不变的，也会很大程度地决定我们的人生态度。&lt;/p&gt;
&lt;p&gt;比如很多人说，及时行乐。这也是一种人生哲学，而且有时候很智慧。为什么要及时行乐？就是因为事物永远变化嘛，如果外在境遇一直变，我们渺小的人类又难以预测，还有什么比及时行乐，活在当下更实用的呢？&lt;/p&gt;
&lt;p&gt;好了，现在我们遗憾地发现，虽然在逻辑推理上，有无穷无尽的命题可以去玩耍和思考，但我们还是找不出人生的确定意义。&lt;strong&gt;既然无法证明有意义，是否就可以说，人生是没有意义的呢？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我想说的是，这个问题是一个重要的终极命题，但也可以是逻辑游戏，文字游戏。&lt;/strong&gt;在这个过程中，我们非常执着，一定给“人生的意义是什么”找出一个答案，不然就茶不思，饭不想，睡不着觉。&lt;/p&gt;
&lt;p&gt;可是还记得我开头说的，&lt;strong&gt;很多时候我们走入死胡同，是因为问题问错了，而不是答案找不出来。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;给人生找出意义，从来就不是我们的真正目的。我们的真正目的，是如何活着。&lt;/strong&gt;如果你还没有死，那你就在活着。如果你活着，你就必须选择和经历一种生活方式，大到癌症晚期了是继续化疗还是环游世界，小到被人骂了是不是要还击。这才是哲学“有用”的原因。不同的哲学观，会转化为不同的价值观，进而转化为日常生活中处理问题的方式。如何花掉时间，如何对待金钱，如何做出不后悔的选择，或者怎么选都不后悔。这些才是我们真实需要解决的问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;所以应该被讨论的问题是：我们是否能接受人生是没有意义的？如果人生没有意义，我们应该怎么活着？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;又一次，这是一个没有标准答案的问题，但这也正是它的魅力之处。让我们暂时抛开逻辑，哲学，理性，用发散的感性去试图回答。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;首先，接受了人生没有意义，就轻易获得了自由。&lt;/strong&gt;这就好像一艘要去执行命令的军舰，在海上被通知，目的地没有了，你想去的地方根本不存在。那如果舵手有这个权利，他会瞬间感到，自己可以去世界上的任何地方，因为都一样。现实生活中也是一样。有过濒死体验的人，常常会因此极大程度地转变很多人生观念。中国古话说，生不带来，死不带去。那为什么我们还要对拥有的一切如此执着呢？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自由体现在方方面面，比如不再需要和人比较。&lt;/strong&gt;既然你我的人生都没有意义，那在”实现意义“上，我们也就没有差别。富豪追求钱，成功人士追求成功，父母望子成龙，望女成凤，没得到的求得到，得到的求不失去。可是兜兜转转，只是欲望升起与被满足，没有什么本质差别。这就是当年叔本华的核心观点，也是为什么他说，人生只有两种状态，痛苦和无聊。&lt;/p&gt;
&lt;p&gt;几天前我跟一个常年打坐的朋友聊天，倾诉了自己的一个困扰。经常冥想，你平时看世界就会在一种觉知中去观察。观察的结果就是，世界只是变化着的表象。人对世界的捕捉，永远被自己的五感所限制。你观察到的并不是世界本来的样子，而是你自己的感觉。所以，你的观察对象只有自己。那么这时候，会有一种油然而生的孤独，因为你觉得大家都只”活在自己的世界里“，你的世界又只存在于自己的感官体验中，或者说只为你而存在。&lt;/p&gt;
&lt;p&gt;我的朋友回答我说，你为什么孤独呢？因为你还是在比较。如果这个地球上只剩下你一个人，你会觉得孤独吗？我想想说不会。他说，对，那是因为没有比较对象了。人是社会动物，就算每个人的世界是属于他自己的”表象“，而没有人知道世界本来的样子（不可知），那你也会想去比较，你和他的表象世界谁更好，谁更幸福呢？有没有更好的可能呢？凭什么我在这个平行宇宙中，而不能在另一个呢？&lt;/p&gt;
&lt;p&gt;曾经一个很智慧的朋友跟我说，人生是没有意义的，所以我早就放弃改变世界了。想要改变世界，或帮助世界的人，都是因为他们还想当神。嗯，是啊，还想当神。萨特说，他人即地狱。庄周说，子非鱼，焉知鱼之乐。你都无法知道什么是更好，什么是更坏，什么是别人真正想要的，人类到底有没有在进步，又怎么敢说在帮世界变得更好呢？难道不是为了自己内心的 ego 吗？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.syuez.com/blog/img/1551798908660.gif&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我这辈子数过最多的钱，就是别人的钱&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;其次，承认人生没有意义，会激发小我之外，理性之外的很多潜能，比如”喜欢“。&lt;/strong&gt;有多少中国人年轻时苦读十几年，是因为父母告诉你，这样才能找到好工作，找到好工作才能 xxx，xxx 才能 yyy。仿佛一辈子都可以计划，可以掌控。但如果现在，你发现这些都没有意义，就算 yyy 了，你也不会开心，因为那不是人生的本质，况且世事难料，你也越来越难掌控能得到 yyy，那你就有可能在某一个时刻开始放飞自我。&lt;/p&gt;
&lt;p&gt;有一次我在巴厘岛参加一个冥想活动，遇到的全是来自世界各地的年轻人，有俄罗斯的，美国的，新西兰的，印度的。他们很像，10 个里面有 10 个都是 25-30 岁，毕业了，换过 1-2 份工作，突然某一天就发现，一切都没有意义，虽然不知道以后干什么，怎么才能有意义，不如先按下暂停键。他们要么是再回到学校读书，要么辞职创业，做自由职业者，要么先旅行个半年一年再说。&lt;/p&gt;
&lt;p&gt;我深深惊讶于，原来这种”四分之一人生危机“，在全世界哪都一样啊。为什么没有人更早点告诉我人生没有意义？那我可能早就离真正的自己更近一些。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;”喜欢“的力量是强大的。因为它超越了理性，战胜了小我。&lt;/strong&gt;为什么音乐是那么美好而强大？不管是醒着还是睡了，我们的潜意识里，大脑都在拼命乱跑，思考这个，驾驭那个。可是听到喜欢的音乐，你的注意力就轻而易举地被集中在音乐上了，在那个最专注，最享受的瞬间里，你忘记了自我。如果连”我”都没了，人生意义这个话题就自然不存在了。&lt;/p&gt;
&lt;p&gt;如果你打开抖音，你会发现“喜欢”可以是无穷无尽种可能性，而且几乎都是天赋异禀，与生俱来。但是在中国的社会价值观里，其实很避讳把“喜欢”放在很高的位置上。比之更重要的，是靠谱，物质保障，社会规则，你满足了所有人，最后才有资格去满足自己。&lt;/p&gt;
&lt;p&gt;但是如果人生根本没有意义呢？人生短短几十年，满足了所有人之后，“自己”的影子都不知道飘哪里去了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.syuez.com/blog/img/1551799019087.gif&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本想活成一条咸鱼，没想到活成了一条肥鱼&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;人生的方向是谁来决定的呢？这也曾经是哲学范畴的一个重要问题。但是超不出这几种可能：1. 自己；2. 神（统称，也可以是高我，自然规律，超自然力量等）；3. 只是概率。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你认为是 1，我们今天就不会在这讨论这个问题，你也不会读到这里。如果在我们的认知范畴里，人生是没有意义的，那你连控制人生的方向都没有，决定不决定都没有区别。&lt;/p&gt;
&lt;p&gt;如果是 2 或 3，那他们有个共同点，就是都无法被预测。在概率的世界里，你可以说A与B里，你有更高的概率到达 A。但不管选了 A 还是 B，对你来说都是 100%。比如绝症患者，做手术活的概率 60%，手术失败 40%。这个数字的理性暗示是很明显的，但却十分难以抉择，因为概率体现到个体的结果，就是绝对。  &lt;/p&gt;
&lt;p&gt;而”喜欢“或“爱”，像是一种小小的提示。为什么人会天生喜欢某种东西？而且人与人如此不同？喜欢的更深层含义，也是超越自我。在某种你喜欢的事物里，你的内心不一定是快乐的，但更可能是宁静的。&lt;strong&gt;你无法肯定，”我在喜欢的事情里找到了人生的意义。“但可以肯定的是，你暂时忘记了“人生意义”这回事，你的身心沉浸在比自我实现更高的层面里。&lt;/strong&gt; 这就是为什么，有的母亲看着自己爱的孩子，不再惧怕死亡。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但是不管我提出多少个接受“人生没有意义”的好处，你都会问，如果人生没有意义，那生活的动力来自于哪里呢？&lt;/strong&gt;如果选 A 和选 B 都没有区别，我还为什么要努力？那人不就变成消极悲观的动物，整天做人性驱使你做的最轻松的事情，一直到自杀或死亡的那一刻吗？&lt;/p&gt;
&lt;p&gt;答案是，除了脑子，我们还有心。&lt;strong&gt;承认人生没有意义，不是因为我们知道了宇宙，大自然，人类的本质，而恰恰是因为我们不知道。&lt;/strong&gt;这是因为我们所探究的问题，超越了我们的感官认知，大脑认知的极限。就比如你可以去看数学家做出的 4 维空间模型，但你无法直观地理解，生活在 4 维世界是什么样子，就像蚂蚁永远无法理解人类的三维世界一样。它从一个盒子的顶点爬到另一个对角顶点，会觉得自己走了一条直线。&lt;/p&gt;
&lt;p&gt;人类计算机进步到今天，对人工智能寄予厚望。可是人工智能的发展极限，是与生物科技，神经科学相辅相成的。人工智能里最实用的算法，叫神经网络，像是在模仿人的大脑神经计算和决策。可是如果人对自己的神经系统都不够了解，还怎么去开发出模仿它的人工智能呢？这还不要提背后牵扯到的意识等科学还难以触碰的领域。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.syuez.com/blog/img/1551799147151.gif&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;前往世外桃源，却没带够移动电源&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;所以与其说人生没有意义，乐观一点的说法是，我们不知道人生的意义。&lt;/strong&gt;我相信神经科学，量子物理，数学，哲学都会继续变化（是变化，不一定是进步），以给我们更大的启发。但这是没有尽头的。人类知道的越多，不知道的就越多，我们终究不是上帝。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;心是什么？&lt;/strong&gt;心是我们渺小的人类，与未知的潜意识也好，宇宙规律也好，高我也好，多维空间也好，连接的桥梁。迫使我们去寻找人生意义的，是小我，但不是全部的我。心会给你直觉，给你启发，给你超越自我的经验。如果心带领我们去的地方，是让自我消失的地方，那这个问题不就迎刃而解了吗？&lt;/p&gt;
&lt;p&gt;有一个我很喜欢的女生朋友。第一次见面，觉得她是个摄影师，在伦敦有个摄影工作室。第二次，会觉得她是个旅行博主，微博几十万粉丝。第三次，怎么变成了艺术家，要去海南做为期 2 个月的艺术项目。而她的背景，是个法律和哲学硕士。我问她，那你现在想往哪发展。她说不知道，但有一种强烈的感觉，今年必须要把拍了 3 年的尼泊尔纪录片拍完，可能要花几个月剪辑。&lt;/p&gt;
&lt;p&gt;令人羡慕的不是她自由自在的生活，因为这不具有普遍性，比如你会说，只有不愁物质需求的人才能这样。但我想说的是，有时候超越理性有很多好处，比如不用去定义自己。谁说一个人就要把工作，生活，主业，副业，爱好，家庭，朋友，全部分开，然后一个一个贴标签？为什么不能是，现在我想做这个，今年我要做那个，他们可以没有任何共同点，唯一相同的就是我的心告诉我喜欢。&lt;/p&gt;
&lt;p&gt;全力以赴，乐在其中的原因，不是为了结果，也不是为了寻找或到达某种意义。而是，顺其自然，顺应内心的状态。寻找人生意义，是为了让内心有个地方安放。可是心安放的地方，不一定是一个叫“意义”的东西上啊。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;《金刚经》说，应无所住，而生其心。&lt;/strong&gt;对人生意义的追求，也是一种莫大的执着。为什么聪明人更容易喜欢冥想？因为冥想不是想，而是观。放下理性，放下逻辑，放下如水流般不舍昼夜流淌的思维，直接去见，不是更可靠？&lt;/p&gt;
&lt;p&gt;什么是觉醒呢？我的一个朋友有个比喻。他说觉醒就像，你生下来像一张白纸，画啊画啊，突然有一天不知道哪根筋搭错了，觉得以前十几年，几十年画的画，都不满意。有的人选择去修改这幅画，比如油画里一层一层地覆盖。可惜人生是不能重来的。而还有一些人，突然意识到，他其实不止是那幅画，也是画画的人。所以他才能欣然接受以前的画，也能坦然地继续画下去。因为最重要的，是他意识到自己才是那个画画的人。&lt;/p&gt;
&lt;p&gt;我们每个人，既是超级玛丽，也是玩超级玛丽的人，还是在旁边看玩家在玩超级玛丽的人。这听起来很矛盾，但只是因为我们习惯了二元地去看世界。光既可以是波又可以是粒子，它既可以穿过又可以不穿过一个障碍物，只是我们没法想象。&lt;/p&gt;
&lt;p&gt;人生有没有意义，意义是什么，这依然是个重要又有趣的问题。可是能带着这个未解之谜去坦然地生活，这才是人类的尊严所在。感谢所有的哲学家们，因为他们提出的问题本身，比答案还重要。哲学为所有学科之源头，不仅因为它研究的问题如此重要，还因为一代一代思想家体现出的怀疑精神。&lt;/p&gt;
&lt;p&gt;人生是没有意义的。如果有，那我为你开心。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文转载自微信公众号：禅与宇宙维修艺术&lt;/p&gt;
&lt;p&gt;账号：cosmosrepair&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1551799326585.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;原文地址：&lt;a href=&quot;https://mp.weixin.qq.com/s/YbJ6l-vZqfsQdWUcS6ZjMQ&quot;&gt;为什么人生是没有意义的&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BA%BA%E7%94%9F%E6%98%AF%E6%B2%A1%E6%9C%89%E6%84%8F%E4%B9%89%E7%9A%84.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BA%BA%E7%94%9F%E6%98%AF%E6%B2%A1%E6%9C%89%E6%84%8F%E4%B9%89%E7%9A%84.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>用Python粗糙地实现贝叶斯推理之β分布</title>
            <description>
            &lt;!--
author: admin
date: 2019-03-04
title: 用Python粗糙地实现贝叶斯推理之β分布
tags: β分布,贝叶斯
category: Python
status: publish
summary: 本文属于无聊之作,水平有限,还望好心人指点
--&gt;
&lt;h4&gt;用Python粗糙地实现贝叶斯推理之β分布&lt;/h4&gt;
&lt;h4&gt;前言&lt;/h4&gt;
&lt;p&gt;本文给出的代码只是为了好玩，没有什么质量可言，遵循&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Make it run , Make it right , Make it fast&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;先让它跑起来，至于代码美观和效率则不考虑，反正也没人用，自娱自乐&lt;/p&gt;
&lt;h4&gt;将概率的概率作为先验概率&lt;/h4&gt;
&lt;p&gt;在贝叶斯推理中，有先验概率，条件概率，后验概率。
具体的定义这里不再详述，之前的文章也有提及。为了便于理解“将概率的概率作为先验概率”，这里从一个示例讲起，选自《小岛宽之. 统计学关我什么事：生活中的极简统计学》&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一对夫妇第一胎生了女孩，请问第二胎是女孩的概率？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这对夫妇生女孩的概率为P，假设P=0.4，P=0.5，P=0.6，即这对夫妇生女孩的概率是0.4，0.5，0.6 。
&lt;strong&gt;概率的概率&lt;/strong&gt; 就是这对夫妇生女孩的概率是0.4的概率，这对夫妇生女孩的概率是0.5的概率，这对夫妇生女孩的概率是0.6的概率。
把&lt;strong&gt;概率的概率作为先验概率&lt;/strong&gt;，由于我们不知道这对夫妇到底是哪一种类型，假设每种的概率都相同，当然，先验概率就是可以随便给出的，这里都取1/3。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1551429380051.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因为第一胎是女孩，所以&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1551429461444.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里主要介绍下&lt;strong&gt;将概率的概率作为先验概率&lt;/strong&gt;，为下面的内容做个基础准备。&lt;/p&gt;
&lt;h4&gt;更具体的概率&lt;/h4&gt;
&lt;p&gt;上面的示例中，这对夫妇生女孩的概率只有三种情况【0.4，0.5，0.6】，但是实际生活中有无穷种可能，从0到1，是连续的。为了方便计算，这里采用从0-100（0，1，2，...，98，99，100），即&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这对夫妇生女孩的概率是0%&lt;/p&gt;
&lt;p&gt;这对夫妇生女孩的概率是1%&lt;/p&gt;
&lt;p&gt;这对夫妇生女孩的概率是2%&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;这对夫妇生女孩的概率是98%&lt;/p&gt;
&lt;p&gt;这对夫妇生女孩的概率是99%&lt;/p&gt;
&lt;p&gt;这对夫妇生女孩的概率是100%&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;每种情况的概率相等，也就是从0到100的概率相等，共101种情况，概率是100（百分制），那么每种概率就是100/101，先验概率就是(100/101)&lt;/p&gt;
&lt;p&gt;类比刚才只有三种情况的做法，画出矩形表格，这里就不画了，然后出生的结果是女孩，去掉是男孩的部分，剩下的面积要符合总概率等于100的情况，计算出每个概率所对应的概率，就是后验概率。&lt;/p&gt;
&lt;h4&gt;不忍直视的Python代码&lt;/h4&gt;
&lt;p&gt;代码写得很烂，先让它跑起来，以后再优化下（如果可能的话，呵呵！）&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# -*- coding: UTF-8 -*-
import numpy

&#039;&#039;&#039;
自定义变量
init_prior_pr 初始先验概率
prior_pr 先验概率
posterior_pr 后验概率
result 结果集 (0代表True,1代表False)
x_pr X事件概率
y_pr Y事件概率 （X事件概率 + Y事件概率 = 1）
&#039;&#039;&#039;

def beta_pr(result):
    # 先设置初始先验概率为空列表
    init_prior_pr = []

    # 假设所有概率都相等,通过循环得到初始先验概率列表
    ii = 100/101
    count = 0    
    while (count &amp;lt; 101):
        init_prior_pr.append(ii)
        count = count + 1

    # 初始化X事件的概率
    x_pr = list(range(0, 101))  # 生成 0-100 数字

    # 根据X事件生成Y事件
    y_pr = []
    count = 0
    while (count &amp;lt; 101):
        tmp = 100 - x_pr[count]
        y_pr.append(tmp)
        count = count + 1

    # 将初始先验概率赋值给一个临时变量
    prpr = init_prior_pr

    # 开始处理导入的结果集
    for res in result:

        # 初始化各个值
        x_sum = 0
        y_sum = 0        

        # 从临时变量中得到先验概率
        prior_pr = prpr

        # 计算各个事件的总概率
        for elem in range(101):
            x_sum = x_sum + prior_pr[elem] * x_pr[elem]
            y_sum = y_sum + prior_pr[elem] * y_pr[elem]

        # 处理事件
        if res == 0:
            # 观察到X事件的后验概率
            posterior_pr = []
            for elem1 in range(101):
                pmt = prior_pr[elem1] * x_pr[elem1] / x_sum
                posterior_pr.append(pmt) # 生成后验概率列表

            # 将后验概率赋值给临时变量,在下一轮循环中当作先验概率
            prpr = posterior_pr

            # 计算X事件的各个概率的概率,最后计算出X事件的期望值
            x_expect = 0
            for elem3 in range(101):
                x_expect = x_expect + x_pr[elem3] * posterior_pr[elem3] # 计算期望值

            x_expect = x_expect
            x_expect = round(x_expect, 0)
            # print (x_expect)

        elif res == 1:
            # 观察到Y事件的后验概率
            posterior_pr = []
            for elem2 in range(101):
                mtp = prior_pr[elem2] * y_pr[elem2] / y_sum
                posterior_pr.append(mtp) # 生成后验概率列表

            # 将后验概率赋值给临时变量,在下一轮循环中当作先验概率
            prpr = posterior_pr

            # 计算X事件的各个概率的概率,最后计算出X事件的期望值
            x_expect = 0
            for elem4 in range(101):
                x_expect = x_expect + x_pr[elem4] * posterior_pr[elem4] # 计算期望值

            x_expect = x_expect
            x_expect = round(x_expect, 0)
            # print (x_expect)

    return(x_expect)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里给出的结果是期望，也就是每个概率再乘以它们各自的概率，关于什么是期望，请直接参考维基百科关于&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E6%9C%9F%E6%9C%9B%E5%80%BC&quot;&gt;期望的条目&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;最后，关于β分布&lt;/h4&gt;
&lt;p&gt;如果这对夫妻生女孩的概率是从0到100连续的，那么概率的概率也连续的，这两个数值在一个直角坐标系的第一象限形成一个曲线的图像，就是β分布函数。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1552185320866.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zh.wikipedia.org/wiki/%CE%92%E5%88%86%E5%B8%83&quot;&gt;维基百科上关于β分布的定义&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1552185475307.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个函数的期望：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1552185579863.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上述公式计算的期望结果和上面的Python代码计算结果是一样的&lt;/p&gt;
&lt;p&gt;当这对夫妻第一胎是女孩，那么第二胎还是女孩的概率期望是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;... #省略上述代码
sex = [0] # 女孩为0，男孩为1
print (beta_pr(sex))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/1552186149456.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;β分布函数&lt;/strong&gt;
当概率的概率都是相等的时候，那么β分布函数是一条平行于X轴的线段，Y轴的具体数值不管取决于参数&lt;code&gt;B&lt;/code&gt;的大小&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1552186384674.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;所以这里的先决条件是 α = 1，β =1
当第一胎是女孩，第二胎还是女孩的概率期望&lt;/p&gt;
&lt;p&gt;α = 2 (因为第一胎是女孩，所以可以理解为α+1了)&lt;/p&gt;
&lt;p&gt;β = 1 (同理，如果是男孩那么β+1)&lt;/p&gt;
&lt;p&gt;期望等于 E = α/(α+β)=2/3=0.67(近似值)&lt;/p&gt;
&lt;p&gt;继续增加&lt;/p&gt;
&lt;p&gt;sex = [0,1,1] (女孩，男孩，男孩)&lt;/p&gt;
&lt;p&gt;则&lt;/p&gt;
&lt;p&gt;α = 2，β = 3 &lt;/p&gt;
&lt;p&gt;计算结果是相同的，这里就不写了&lt;/p&gt;
&lt;p&gt;如果想继续了解β分布，推荐阅读知乎上的一篇问答
&lt;a href=&quot;https://www.zhihu.com/question/30269898&quot;&gt;如何通俗理解 beta 分布？&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;全文完&lt;/p&gt;
&lt;p&gt;本文参考：&lt;/p&gt;
&lt;p&gt;《小岛宽之. 统计学关我什么事：生活中的极简统计学》&lt;/p&gt;
&lt;p&gt;维基百科&lt;/p&gt;
&lt;p&gt;Python 手册&lt;/p&gt;
&lt;p&gt;感谢自由的互联网，让我一个毫无基础的人能学到这些知识。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E7%94%A8Python%E7%B2%97%E7%B3%99%E5%9C%B0%E5%AE%9E%E7%8E%B0%E8%B4%9D%E5%8F%B6%E6%96%AF%E6%8E%A8%E7%90%86%E4%B9%8B%CE%B2%E5%88%86%E5%B8%83.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E7%94%A8Python%E7%B2%97%E7%B3%99%E5%9C%B0%E5%AE%9E%E7%8E%B0%E8%B4%9D%E5%8F%B6%E6%96%AF%E6%8E%A8%E7%90%86%E4%B9%8B%CE%B2%E5%88%86%E5%B8%83.html</guid>
                                               <category>Python</category>
                                    </item>
                <item>
            <title>PHP的CI框架之分页</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-20
title: PHP的CI框架之分页
tags: CodeIgniter
category: PHP
status: publish
summary: 一直被CodeIgniter的分页困扰,从网上找了一篇教程（地址见文章最后）,尝试用最简单基础的方式实现下,水平有限，还望见谅！
--&gt;
&lt;h4&gt;PHP的CI框架之分页&lt;/h4&gt;
&lt;p&gt;这里使用的示例是以分页的方式显示国家名称，&lt;a href=&quot;https://www.syuez.com/blog/files/country.sql&quot;&gt;数据库文件&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;对于分页，需要知道两个数据：
1、数据的总条目数
2、每页显示的条目数&lt;/p&gt;
&lt;h4&gt;Model&lt;/h4&gt;
&lt;p&gt;初始化&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function __construct()
    {
        parent::__construct();
        // 下面的代码将根据你的 数据库配置 加载并初始化数据库类
        $this-&amp;gt;load-&amp;gt;database();
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查询总条目数&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function country_count()
    {
        return $this-&amp;gt;db-&amp;gt;count_all(&quot;countries&quot;);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查询特定条目数，&lt;code&gt;$limit&lt;/code&gt;表示查询的条目数，&lt;code&gt;$start&lt;/code&gt;就是&lt;code&gt;offset&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function fetch_countries($limit, $start) {
        $this-&amp;gt;db-&amp;gt;limit($limit, $start);
        $query = $this-&amp;gt;db-&amp;gt;get(&quot;countries&quot;);

        if ($query-&amp;gt;num_rows() &amp;gt; 0) {
            foreach ($query-&amp;gt;result() as $row) {
                $data[] = $row;
            }
            return $data;
        }
        return false;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Controller&lt;/h4&gt;
&lt;p&gt;初始化&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function __construct() {
        parent:: __construct();
        $this-&amp;gt;load-&amp;gt;helper(&quot;url&quot;);
        $this-&amp;gt;load-&amp;gt;model(&quot;countries&quot;);
        $this-&amp;gt;load-&amp;gt;library(&quot;pagination&quot;);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建方法&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function countries()
    {
        // 这四个参数是必需的
        $config[&#039;base_url&#039;] = base_url() . &#039;demo/countries/&#039;;
        $config[&#039;total_rows&#039;] = $this-&amp;gt;countries-&amp;gt;country_count();
        $config[&#039;per_page&#039;] = 6;
        $config[&quot;uri_segment&quot;] = 3;//自动检测你 URI 的哪一段包含页数
        //-------------------------
        $this-&amp;gt;pagination-&amp;gt;initialize($config);
        //三元运算，$this-&amp;gt;uri-&amp;gt;segment(3)非空就执行$this-&amp;gt;uri-&amp;gt;segment(3)否则赋值为0
        $page = ($this-&amp;gt;uri-&amp;gt;segment(3)) ? $this-&amp;gt;uri-&amp;gt;segment(3) : 0;
        $result[&#039;results&#039;] = $this-&amp;gt;countries-&amp;gt;fetch_countries($config[&#039;per_page&#039;],$page);
        $result[&quot;links&quot;] = $this-&amp;gt;pagination-&amp;gt;create_links();
        $this-&amp;gt;load-&amp;gt;view(&quot;example1&quot;, $result);

    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中&lt;code&gt;$this-&amp;gt;uri-&amp;gt;segment(3)&lt;/code&gt;是获取URL中第三段的内容，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Hello extends CI_Controller 
{
    public function __construct()
    {
        parent::__construct();
        $this-&amp;gt;load-&amp;gt;helper(&#039;url&#039;);
    }

    public function test()
    {
        $result = $this-&amp;gt;uri-&amp;gt;segment(2);
        var_dump($result);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在浏览器中运行示例 &lt;a href=&quot;http://localhost/index.php/hello/test/&quot;&gt;http://localhost/index.php/hello/test/&lt;/a&gt;  结果&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1550130937182.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;改变 &lt;code&gt;segment()&lt;/code&gt;中的参数，得到结果不同
&lt;code&gt;$this-&amp;gt;uri-&amp;gt;segment(3);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1550131031285.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;改变浏览器中的URL，结果也不同&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1550131092411.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;总之，&lt;code&gt;$this-&amp;gt;uri-&amp;gt;segment(int)&lt;/code&gt;是获取URL对应段中内容的函数&lt;/p&gt;
&lt;h4&gt;Views&lt;/h4&gt;
&lt;p&gt;在views目录下创建&lt;code&gt;example1.php&lt;/code&gt;文件，写入&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-htmlbars&quot;&gt;&amp;lt;body&amp;gt;
 &amp;lt;div id=&quot;container&quot;&amp;gt;
  &amp;lt;h1&amp;gt;Countries&amp;lt;/h1&amp;gt;
  &amp;lt;div id=&quot;body&quot;&amp;gt;
&amp;lt;?php
foreach($results as $data) {
    echo $data-&amp;gt;country .&quot;&amp;lt;br&amp;gt;&quot;;
}
?&amp;gt;
   &amp;lt;p&amp;gt;&amp;lt;?php echo $links; ?&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;p class=&quot;footer&quot;&amp;gt;Page rendered in &amp;lt;strong&amp;gt;0.0219&amp;lt;/strong&amp;gt; seconds&amp;lt;/p&amp;gt;
 &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中的&lt;code&gt;$results&lt;/code&gt;与控制器中的&lt;code&gt;$result[&#039;results&#039;]&lt;/code&gt;是同一个。&lt;/p&gt;
&lt;h4&gt;运行&lt;/h4&gt;
&lt;p&gt;在浏览器中打开http://localhost/index.php/demo/countries/即可运行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1550650684383.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文参考：
&lt;a href=&quot;https://www.sitepoint.com/pagination-with-codeigniter/&quot;&gt;Pagination with CodeIgniter&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/PHP%E7%9A%84CI%E6%A1%86%E6%9E%B6%E4%B9%8B%E5%88%86%E9%A1%B5.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/PHP%E7%9A%84CI%E6%A1%86%E6%9E%B6%E4%B9%8B%E5%88%86%E9%A1%B5.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>关于贝叶斯推理中的条件概率</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: 关于贝叶斯推理中的条件概率
tags: 贝叶斯,概率
category: 深度学习
status: publish
summary: 关于贝叶斯推理中的条件概率
--&gt;
&lt;h4&gt;关于贝叶斯推理中的条件概率&lt;/h4&gt;
&lt;p&gt;贝叶斯推理最重要的观点是“获得信息之后，概率发生变化”&lt;/p&gt;
&lt;p&gt;这里，用掷骰子的案例来进行说明。
把一个骰子放入带有盖子的箱中，并摇晃箱子，使骰子在箱子中滚动。接下来，推测骰子的点数。现在，需要求出骰子的点数为偶数的概率。然后把“骰子的点数为偶数”这个事件记为E，则：
$$E={2,4,6}$$
在掷骰子的概率模型中，事件E的概率为：
$$p(E)=\frac {3}{6}=\frac{1}{2}$$
然而此时，有人偷偷地打开了盖子，并往箱子里看了一眼，然后告诉你“骰子的点数不是6”。那么接下来概率会发生怎样的变化呢？由于点数为6的可能性被排除在外，那么对于概率的推算结果也会发生变化。像这样，当获得“不是6”这条信息时，“骰子的点数为偶数”的概率被称为“&lt;strong&gt;条件概率&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;把“不是6”这一事件记为F,则：
$$F={1,2,3,4,5}$$
此时，在获得“发生了事件F”这条信息的情况下，事件E的概率记为：
$$P(E|F)$$
记号p(|)的含义是：间隔符号的右侧表示获得的信息。
在计算数值的时候，比较自然的想法是使用面积图表，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535975435693.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，没有获得任何信息的时候，由于事件E占了整体的一半面积，因而它的概率p(E)为1/2。但当获得了事件F即“不是6”这一信息之后，事件F就开始变得引人注目。因此，有两个问题需要进行变更。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一个变更：&lt;/strong&gt;由于事件F变为了一个整体，所以应该把事件F的概率设定为1。换言之，把F的面积视为1。
&lt;strong&gt;第二个变更：&lt;/strong&gt;由于事件F的发生，可能性受到了限制，因而需要在考虑事件E与事件F的共同部分的基础上，来推算概率问题。换言之，需要关注的事件为E和F的重叠部分={2,4}。&lt;/p&gt;
&lt;p&gt;根据上述两个变更，需要计算的概率p(E|F)，即：获得“发生事件F”这一信息之后，E的条件概率，也就是：把F看做一个整体来考虑时，“E和F的重叠部分”占F的比例。因此，可以用除法计算求出，表示为：&lt;/p&gt;
&lt;p&gt;$$\frac{E和F重叠部分的面积}{F的面积}$$&lt;/p&gt;
&lt;p&gt;因此，可进行如下定义：&lt;/p&gt;
&lt;p&gt;$$P(E|F)=P(E和F的重叠部分)÷P(F)$$&lt;/p&gt;
&lt;p&gt;进行实际计算，可得出：&lt;/p&gt;
&lt;p&gt;$$P(E|F)=P({2,4})÷P({1,2,3,4,5})=\frac {2}{6}÷\frac{5}{6}=\frac{2}{5}$$&lt;/p&gt;
&lt;p&gt;在没有获得信息F的时候，E的概率为(1/2)，之后，由于获得了信息F，全部可能减少了1个，并且偶数也减少了1个。而偶数减少1个的情况占优势，于是E的概率随之减少，变为(2/5)。&lt;/p&gt;
&lt;p&gt;总而言之，&lt;strong&gt;条件概率是指：把得到的消息再次设定为整体，并排除掉没有可能性的各个事件之后，重新计算出的比率。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以上说明可以写成通用的公式，如下所示：
&lt;strong&gt;条件概率的公式&lt;/strong&gt;
当获得事件B这一信息之后，事件A的条件概率P(A|B)，可定义为：&lt;/p&gt;
&lt;p&gt;$$P(A|B)=P(A和B的重叠部分)÷P(B)$$&lt;/p&gt;
&lt;p&gt;若要在贝叶斯推理中使用条件概率，使用方法分为两个阶段。第一阶段：按照各自的类别设定数据概率的方法；第二阶段：计算后验概率时的方法。而重要的一点是，在这两个阶段中，都可以有效利用直积试验的特性。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;问题设定：
面前有一只壶，已知这个壶不是A壶就是B壶，但是单从外表看不出究竟是哪个。而目前已知的是：A壶中有9个白球和1个黑球，B壶中有2个白球和8个黑球。现在，如果从壶中取出1个球，并且这个球是黑色的，那么，面前的这个壶究竟是A还B呢？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个案例中，所有的可能性共有4种。用专有名词可以表述为：基本事件的集合={A&amp;amp;黑球，A&amp;amp;白球，B&amp;amp;黑球，B&amp;amp;白球}，也就是直积试验的各个事件，如下图所示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535987142792.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;“从A壶中取出的球是黑球的概率为0.1”这句话就是条件概率，实际含义是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在获得“该壶为A壶”这个信息之后，得出的“取出的球为黑球”的概率&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;用公式来表达，即：&lt;/p&gt;
&lt;p&gt;$$P(黑球|A)=0.1$$&lt;/p&gt;
&lt;p&gt;“A&amp;amp;黑球”的概率为 0.5×0.1&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535987546071.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A&amp;amp;黑球，是事件“A”和事件“黑球”的重叠部分&lt;/p&gt;
&lt;p&gt;另外从上图可以看出以下信息&lt;/p&gt;
&lt;p&gt;事件A可以表示为：&lt;/p&gt;
&lt;p&gt;$$A={A\&amp;amp;黑球,A\&amp;amp;白球}$$&lt;/p&gt;
&lt;p&gt;即，“该壶为A壶，球为任意颜色”的事件。同理，事件“黑球”可以表示为：&lt;/p&gt;
&lt;p&gt;$$黑球={A\&amp;amp;黑球,B\&amp;amp;黑球}$$&lt;/p&gt;
&lt;p&gt;也就是说，
事件A和事件“黑球”的重叠={A&amp;amp;黑球}&lt;/p&gt;
&lt;p&gt;然后使用上面的条件概率公式：&lt;/p&gt;
&lt;p&gt;$$
P(黑|A)=P(事件A和事件“黑球”的重叠)÷P(A)=P(A\&amp;amp;黑球)÷P(A)
$$&lt;/p&gt;
&lt;p&gt;即：&lt;/p&gt;
&lt;p&gt;$$P(黑|A)=P(A\&amp;amp;黑球)÷P(A)$$&lt;/p&gt;
&lt;p&gt;用乘法算式来表达，则为：&lt;/p&gt;
&lt;p&gt;$$P(A\&amp;amp;黑球)=P(A)×P(黑|A)......(1)$$&lt;/p&gt;
&lt;p&gt;这里，类别A的概率为0.5 。 此外，从A中观察到为黑球的条件概率P(黑|A)被设定为0.1，所以，&lt;/p&gt;
&lt;p&gt;$$P(A\&amp;amp;黑球)=0.5×0.1=0.05......(2)$$&lt;/p&gt;
&lt;p&gt;这样，便可以用乘法计算出A&amp;amp;黑球的概率。&lt;/p&gt;
&lt;p&gt;贝叶斯推理通过“取出的球为黑球”这一信息，来推测“该壶为B壶”的概率。由于“取出的球为黑球”是观察的“结果”，而“该壶为B壶”是“原因”，从“结果”来推测“原因”，听起来是一个奇妙的过程。而这个过程之所以能够实现，关键就在于条件概率的定义。&lt;/p&gt;
&lt;p&gt;我们要计算的是：在获得到“取出的球为黑球”这一信息后，“该壶为B壶”的概率。由于已经明确定义了条件概率，因此可以完全确定下来，即条件概率为：P(B|黑)
而该条件概率的计算即：&lt;/p&gt;
&lt;p&gt;$$P(B|黑)=P(B\&amp;amp;黑球)÷P(黑球)......(3)$$&lt;/p&gt;
&lt;p&gt;因此只要知道概率P(B&amp;amp;黑球)和概率P(黑球)的数值，然后用除法运算，就可以求出了。&lt;/p&gt;
&lt;p&gt;前面的P(B&amp;amp;黑球)，运用刚刚在(1)(2)式子中求出P(A&amp;amp;黑球)同样的计算方法，就可以求出。即为：&lt;/p&gt;
&lt;p&gt;$$P(B\&amp;amp;黑球)=P(B)×P(黑|B)......(4)$$&lt;/p&gt;
&lt;p&gt;这里，需要注意的是：条件概率P( )中的内容被随意地左右替换。在(3)中是P(B|黑)，而在(4)中则是P(黑|B)。前者为需要计算的数值，而后者可以通过从模型的设定得出结果为0.8 。而事件“该壶为B壶”与事件“取出的球为黑球”可以进行更换，正是贝叶斯推理的秘密所在。那么，从(4)中可以计算出：&lt;/p&gt;
&lt;p&gt;$$P(B\&amp;amp;黑球)=0.5×0.8=0.4......(5)$$&lt;/p&gt;
&lt;p&gt;而关于概率P(黑球)的计算，由于“取出的球为黑球”这一事件是能够通过&lt;/p&gt;
&lt;p&gt;$$“黑球”={A\&amp;amp;黑球,B\&amp;amp;黑球}$$&lt;/p&gt;
&lt;p&gt;以及使用了符号&amp;amp;的各个基本事件表示出来，因此，可以运用以下方法计算求出：&lt;/p&gt;
&lt;p&gt;$$P(黑球)=P(A\&amp;amp;黑球)+P(B\&amp;amp;黑球)$$&lt;/p&gt;
&lt;p&gt;右边的第一项是通过(1)求得，而第二项是通过(4)求得的。将结果代入上述式子中，可以得出：&lt;/p&gt;
&lt;p&gt;$$P(黑球)=P(A)×P(黑|A)+P(B壶)×P(黑|B)......(6)$$&lt;/p&gt;
&lt;p&gt;因此，把(4)和(6)代入(3)中，可以得出下面的公式：&lt;/p&gt;
&lt;p&gt;$$
P(B|黑)=\frac {P(B)P(黑|B)}{P(A)P(黑|A)+P(B)P(黑|B)}......(7)
$$&lt;/p&gt;
&lt;p&gt;这被称为“&lt;strong&gt;贝叶斯公式&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;进行具体计算，则为：&lt;/p&gt;
&lt;p&gt;$$P(B|黑)=0.5×0.8÷{0.5×0.1+0.5×0.8}=0.4÷0.45=\frac {8}{9}$$&lt;/p&gt;
&lt;p&gt;式子(7)可以按照以下思路来理解：左边表示从“黑球”的结果追溯到“B壶”这一原因的概率，从直观上不是很容易理解。而右边的P(A)和P(B)均为每一类别的鲜艳概率，P(黑|A)和P(黑|B)是由原因推导出的结果的概率，这一点已经在设定中予以说明。换言之，式子(7)是通过已知的概率(右边)，推导出直观上看不出的概率(左边)的计算方式。&lt;/p&gt;
&lt;p&gt;乍一看式子(7)，可能会觉得计算过程很复杂，令人迷惑。不过只要在面积图中填入前面讲过的概率符号，就能明白“&lt;strong&gt;现在做的，只是把之前面积图的方法直接转换为计算公式罢了&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1535991661985.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下面观察上图。迄今为止，我们采用的计算方式都是在获得“取出的球为黑球”这一信息之后，再得出以下比例关系：&lt;/p&gt;
&lt;p&gt;$$
(A的后验概率):(B的后验概率)=(A\&amp;amp;黑球的面积):(B\&amp;amp;黑球的面积)
$$&lt;/p&gt;
&lt;p&gt;用条件概率来描述，则可以得到如下比例公式：&lt;/p&gt;
&lt;p&gt;$$P(A)P(黑|A):P(B)P(黑|B)......(8)$$&lt;/p&gt;
&lt;p&gt;式子(8)中，左右两边的计算，与通过乘法计算长方形的长宽而得出的概率是一样的。然后，在满足标准化条件的情况下进行变形(左右数值之和相除)，得到：&lt;/p&gt;
&lt;p&gt;$$
P(A)P(黑|A):P(B)P(黑|B)=\frac {P(A)P(黑|A)}{P(A)P(黑|A)+P(B)P(黑|B)}:\frac {P(B)P(黑|B)}{P(A)P(黑|A)+P(B)P(黑|B)}
$$&lt;/p&gt;
&lt;p&gt;由此又可以得到以下公式：&lt;/p&gt;
&lt;p&gt;$$
(B壶的后验概率)=\frac {P(B)P(黑|B)}{P(A)P(黑|A)+P(B)P(黑|B)}......(9)
$$&lt;/p&gt;
&lt;p&gt;最后的式子（9），与（7）是完全相同的。&lt;/p&gt;
&lt;p&gt;下面，我们通过用来说明条件概率的面积比例的思路，再次进行探讨。&lt;/p&gt;
&lt;p&gt;现在，我们已经获得了“取出的球为黑球”这一信息，那么，正如15-2中的解说，B的条件概率即为：在表示“A＆黑球”的长方形与表示“B＆黑球”的长方形的总和（表示事件“黑球”的情况）中，表示“B＆黑球”的长方形所占面积的比例这一数值。而在式子（8）中，左侧为表示“A＆黑球”的长方形的面积，右侧为表示“B＆黑球”的长方形的面积。因此，用右侧来除以左右之和，其结果，与“在‘取出的球为黑球’的情况下，计算表示‘B＆黑球’的长方形面积所占比例”的结果是相同的。这也意味着，最后的计算与条件概率p（B|黑）的面积所代表的意义相一致。&lt;/p&gt;
&lt;p&gt;最后需要说明的一点重要内容：采用贝叶斯推理方法计算后验概率时，无须考虑式子（7）中的分母。要点是，因为有了比例公式（8），那么（7）和（9）的分母，只是用来恢复标准化条件罢了，可以忽略。毕竟，关键点在于比例关系。因此我们只需记住比例公式（8）即可。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文摘自《小岛宽之. 统计学关我什么事：生活中的极简统计学》第15章，内容有删减。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%85%B3%E4%BA%8E%E8%B4%9D%E5%8F%B6%E6%96%AF%E6%8E%A8%E7%90%86%E4%B8%AD%E7%9A%84%E6%9D%A1%E4%BB%B6%E6%A6%82%E7%8E%87.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%85%B3%E4%BA%8E%E8%B4%9D%E5%8F%B6%E6%96%AF%E6%8E%A8%E7%90%86%E4%B8%AD%E7%9A%84%E6%9D%A1%E4%BB%B6%E6%A6%82%E7%8E%87.html</guid>
                                               <category>深度学习</category>
                                    </item>
                <item>
            <title>贝叶斯定理的另一些东西</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: 贝叶斯定理的另一些东西
tags: 贝叶斯
category: 深度学习
status: publish
summary: 贝叶斯定理的另一些东西
--&gt;
&lt;h4&gt;贝叶斯定理的另一些东西&lt;/h4&gt;
&lt;p&gt;本文示例节选自《智识分子· 做个复杂的现代人 》，标题：贝叶斯定理的胆识，作者：万维钢&lt;/p&gt;
&lt;p&gt;前面的就不抄到这里了，找原版的书看吧。&lt;/p&gt;
&lt;p&gt;贝叶斯定理最关键的思想是：当B发生后，有了这个新的证据，我们对A的信念就需要做一个调整，从P(A)变成P(A|B)了。你可以把A当成你对一般情况的理论预言，把B当成一次实验结果。有了新的实验结果，你就调整自己的理论预言。&lt;/p&gt;
&lt;p&gt;现在我们就拿雍和宫祈福这个例子，来看看一个贝叶斯主义者是怎么更新自己的信念的。首先我们用基本的概率公式，把P(B)展开成P(B)=P(B|A)·P(A)+P(B|A+)·P(A+)，其中 A 和 A+ 互为相反的事件，A 表示 “雍和宫好使”，A+ 表示“雍和宫不好使”，P(A+)=1-P(A)。这么做可以更精确地估算P(B)。这样贝叶斯定理要求我们先自行估计三个值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你事先认为雍和宫有多好使，也就是P(A)；&lt;/li&gt;
&lt;li&gt;如果雍和宫好使，某甲因为祈福加持而升职的可能性，也就是P(B|A)；&lt;/li&gt;
&lt;li&gt;如果雍和宫不好使，某甲不借助这个力量而升职的可能性，也就是P(B|A+)。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个比较合理的估计差不多是这样的。某甲既然能升职，必然有过人之处，那么我们可以认为他在没有雍和宫加持的情况下也有50%的升职可能，所以P(B|A+)=0.5。雍和宫就算再灵验也不能有求必应，否则人人出来都成亿万富翁了，我们姑且假设，所谓“灵验”就是能让甲升职的概率大大提升，这样我们可以估计P(B|A)=0.8。如果你事先对雍和宫的信念值是15%，那么P(A)=0.15。&lt;/p&gt;
&lt;p&gt;这样根据贝叶斯定理计算，现在你的信念值应该是P(A|B)=0.22。&lt;/p&gt;
&lt;p&gt;【【【这里具体的计算我就不算了，下面用 Netica 来操作下上面提到的情况，这个才是本文的重点】】】&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536405143132.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开软件新建一个模型&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536405212376.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加自然节点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536405263951.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536405520495.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;右键单击节点，属性和表是之后需要添加信息的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536405843207.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其他信息可选。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536405992655.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后添加第二个节点，某甲(Jia)，事件状态是“升职”和“没升职”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536406070866.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加连接&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536406086762.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使两个事件关联起来&lt;/p&gt;
&lt;p&gt;然后开始设置概率信息，就是Table&lt;/p&gt;
&lt;p&gt;P(A)=0.15
P(A+)=0.85&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536416868475.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;所以“好使”的概率是15%
“不好使”的概率是85%
点击OK完成&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536417017756.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;P(B|A)=0.8，就是雍和宫“好使”的前提下，甲升职的概率
P(B|A+)=0.5，就是雍和宫“不好使”的前提下，甲升职的概率&lt;/p&gt;
&lt;p&gt;这里需要注意的是，概率之和一定是100%，所以上面两个图横向的概率之和都是100%。
根据这个约束条件就可以将上面没有提到的其他概率信息补全。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536417373467.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;完成贝叶斯网络的初始化后就可以计算了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536417434643.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当未观察到甲的信息时，雍和宫“好使”的概率为上面最开始提到的15%&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536417506169.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当观察到甲因为去雍和宫祭拜之后升职这个事件后（升职事件变成了100%），雍和宫“好使”的概率变为了22%&lt;/p&gt;
&lt;p&gt;【【【软件计算的结果跟文中给出的结果一致】】】&lt;/p&gt;
&lt;p&gt;玩这种数字有什么意义呢？这比听风就是雨高级多了。如果我的信念从15%变成22%，那么说明第一，我这个人听劝，有利证据进来了，我的确调高了我的信念值；第二，我这个人稳重，没有听到一个证据就立即发生世界观的彻底改变，过去不怎么信，现在还是不怎么信。听劝又稳重，既做到了开张圣听，也没有妄自菲薄，古代对贤人的要求也不过如此吧？&lt;/p&gt;
&lt;p&gt;而且你可以继续调整信念。假设过了一年你听说另一个朋友某乙，水平与某甲相当，也去了雍和宫祈福升职，结果未能升职！这一次，P(A)=0.22，现在B表示“未能升值”，所以P(B|A)不再是0.8，而应该是0.2，P(B|A+)仍然是0.5，我们计算出，P(A|B)=0.1&lt;/p&gt;
&lt;p&gt;所以因为这一次不灵的事件，你应该把你对雍和宫的信念值从22%调低到10%&lt;/p&gt;
&lt;p&gt;【【【好了，用Netica模拟上面的例子，只需要在刚才的基础上再添加一个节点就好了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536418576717.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先，移除所有Findings，然后选择Uncompile，进入编辑模式&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536418710591.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加另一个节点，和 Jia 相似&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536418786114.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加相应的概率信息，从上面的描述中应该很容易得出图中的数字，然后选择完成网络。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536418918561.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在甲升职了的情况下，雍和宫的信念确实上升到了22%&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536418974203.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当乙去了雍和宫但是仍未升职的情况发生后，雍和宫的信念确实下降到了10.1%&lt;/p&gt;
&lt;p&gt;至此，软件模拟的结果跟文中给出的结果一致。】】】&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;嗯...这篇文章的重点是用Netica模拟下贝叶斯定理的计算，文中的例子来源在最开始已经给出了。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%AE%9A%E7%90%86%E7%9A%84%E5%8F%A6%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF%E2%80%A6.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%AE%9A%E7%90%86%E7%9A%84%E5%8F%A6%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF%E2%80%A6.html</guid>
                                               <category>深度学习</category>
                                    </item>
                <item>
            <title>放诸古今皆准的权力规则</title>
            <description>
            &lt;!--
author: 同人于野
date: 2019-02-06
title: 放诸古今皆准的权力规则
tags: 权力,规则
category: 转载
status: publish
summary: 蔑视权力的人最终被权力所覆灭
--&gt;
&lt;h4&gt;放诸古今皆准的权力规则&lt;/h4&gt;
&lt;p&gt;同人于野
(《东方早报·上海书评》，2013年3月10日 )&lt;/p&gt;
&lt;p&gt;十九世纪末的比利时国王利奥波德二世完全有理由成为一些人心中的偶像。他大力推动民主自由，在四十多年的任期内，把比利时从一个专制独裁国家成功变成了一个现代民主国家。他赋予每个成年男子选举权，甚至比美国提前半个世纪立法允许工人罢工。他对妇女儿童的保护领先于整个欧洲。比利时1881年就普及了基础教育，确保每个女孩都能上到初中，并且在1889年通过法律禁止十二岁以下儿童工作。在利奥波德二世治下，国家的经济像政治一样获得了大发展，他比罗斯福更早采取建设公路和铁路基础设施的手段来减少失业和刺激经济。&lt;/p&gt;
&lt;p&gt;然而在非洲刚果这个比利时殖民地，确切的说是利奥波德二世本人的殖民地，他完全是另外一个形象。刚果人，包括妇女儿童，在奥波德二世的统治下没有任何人权，完全是奴隶。他们在警察部队的强制下劳动，动辄被施以断手之类的酷刑，有超过一千万人被迫害致死，而这一切都是为了保证利奥波德二世在橡胶贸易中获得巨额利润。&lt;/p&gt;
&lt;p&gt;为什么同样一个人可以在一个国家推行民主却在另一个国家施行最残暴的独裁？有人可能立即会说这是制度问题。但“制度”在这里与其说是答案还不如说是问题本身。为什么比利时的制度越来越民主，而同一时期，同一领导人的刚果，却越来越独裁？难道是因为利奥波德二世只爱本国人或者有种族歧视？但后来刚果自己“选”出来的领导人并没有做得更好，仍然是一个糟糕的独裁者。在The Predictioneer’s Game（《预测师的博弈论》）这本书里，斯坦福大学胡佛研究所和纽约大学的政治学教授Bruce Bueno de Mesquita指出，真正原因是在刚果，利奥波德二世只需要让少数人高兴就足以维持自己的统治；而在比利时，他必须让很多人满意才行。我认为这个答案跟“制度论”的区别在于必须让多少人满意，这个人数不是制度“规定”出来的，而是实力的体现。&lt;/p&gt;
&lt;p&gt;Bueno de Mesquita和合作者研究多年，得出了一个能够相当完美地解释很多政治现象的理论。这个理论认为不管是国家、公司还是国际组织，其政治格局不能简单地以“民主”和“独裁”来划分，而必须用三个数字来描写。以国家为例，这个“三围”就是层层嵌套的三种人的人数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;名义选民&lt;/strong&gt;：在名义上有选举权和被选举权的全体公民。然而他们中的很多人，可能对谁当领导人根本没有任何影响力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实际选民&lt;/strong&gt;：那些真正对谁当领导人有影响力的人。对美国来说这相当于是选举这天出来投票的选民，对沙特这样的君主国来说这相当于是皇室成员。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;胜利联盟&lt;/strong&gt;：必须依赖他们，领导人才能维持自己权力的人。对美国总统来说这相当于是在关键选区投出关键一票让你当选的人，对独裁者来说这是你在军队和贵族内部的核心支持者。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;看一个国家是不是真民主，关键并不在于是否举行选举，而在于胜利联盟（以下简称“联盟”）的人数。领导人工作的本质是为联盟服务，因为联盟对领导人有推翻权— 如果你不能保证我们的利益，我们有能力随时换一个。如果联盟的人数很多，那么这个国家就是我们通常所说的民主国家。反过来如果联盟的人数非常少，那么不管这个国家有没有选举，它都是事实上的独裁国家。这个理论看似简单，其背后必须要有大量的数学模型、统计数据和案例支持，它们首先出现在政治学期刊上，然后被总结成一本学术著作The Logic of Political Survival（《政治生存的逻辑》），并在2011年形成一本通俗著作The Dictator’s Handbook（《独裁者手册》）。&lt;/p&gt;
&lt;p&gt;在通俗史书和影视剧中人们经常研究权术，惊异于为什么像慈禧和魏忠贤这种文化水平相当低的人能够把那些饱读诗书的知识分子玩弄于鼓掌之间。难道政治斗争是一门需要特殊天赋的非常学问么？现在Bueno de Mesquita的“三围”理论，可以说是抓住了政治的根本。所有领导人，不论什么体制，其做事的终极目的只有两个：第一是获得权力，第二是保住权力。要知道即使最厉害的独裁者也不可能按自己的意志为所欲为，他们必须依靠联盟才能统治。为此领导人取悦的对象不应该是全体人民，而必须是联盟。这就是为什么那些一心为民或者能从长远筹划国家发展的领导人即使在民主国家也常常干不长，而那些腐败透顶的独裁者却常常可以稳定在位几十年。从这个根本出发，“三围”理论可以回答我们对政治斗争的种种不解之处。朱元璋为什么要杀功臣？变法为什么困难？为什么民主党欢迎非法移民却反对给高技术移民提供特别渠道？民主的美国为什么会推翻别人的民选政府？为什么一个国家的自然资源越丰富，它就越不可能民主化？为什么经济发展并不一定能带来民主？所有这些问题都可以用领导人和联盟的互动来解释。三围理论能把种种帝王之术解释的明明白白，可以说是学术版的“厚黑学”和现代版的《韩非子》。&lt;/p&gt;
&lt;p&gt;政客搞个什么政策，常常从意识形态出发来给自己找理由。比如共和党经常谈论家庭价值，什么反对同性恋和堕胎之类。这些所谓的自由或保守思想都是说给老百姓听的。真正重要的是不同政党各自代表一部分选民的利益，并都争取中间派。政客，是一种比老百姓理智得多的动物，他们并不从个人好恶出发做事，背后完全是利益计算。《独裁者手册》提出了五个通用的权力规则。不管你是独裁者还是民主国家领导人，还是公司的CEO，哪怕你对如何治理国家和管理公司一无所知，只要能不折不扣地执行以下规则，你的权力就可保无虞。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;要让联盟越小越好。联盟人数越少，收买他们要花的钱就越少。&lt;/li&gt;
&lt;li&gt;要让名义选民越多越好。名义选民多，一旦联盟中有人对你不满，你就可以轻易替换掉他。&lt;/li&gt;
&lt;li&gt;控制收入。领导人必须知道钱在哪，而且必须能控制钱的流动。萨达姆上台七年前就已经掌控了伊拉克的石油。&lt;/li&gt;
&lt;li&gt;好好回报联盟对你的支持。一定要给够，但是也不要过多。&lt;/li&gt;
&lt;li&gt;绝对不要从联盟口袋里往外拿钱给人民。这意味着任何改革如果伤害到联盟的利益就很难进行。凯撒大帝曾经想这么做，结果遇刺身亡。历史上变法者常常以失败告终。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;也就是说领导人要做的事情其实非常简单：通过税收、卖资源或者外国援助拿到钱，用一部分钱把联盟喂饱，剩下的大可自己享受— 或者，如果是好的领导人的话，也可以拿来为人民某点福利。一个有意思的问题是既然联盟必须拿到回报，而警察又是一个重要的联盟力量，为什么独裁国家的警察工资反而都比较低？答案非常简单：因为对领导人来说纵容警察腐败是比直接给他们发钱更方便的回报办法。&lt;/p&gt;
&lt;p&gt;联盟是领导人的真正支持者，但由于其掌握推翻领导人的手段，他们也是领导人的最大敌人。领导人对付联盟，除了必须收买之外，还有一个用外人替换的手段。路易十四继位初期联盟里的贵族都不是自己人，他的做法就是扩大名义选民，给外人进入政治和军事核心圈子的机会，用新贵族替代旧贵族，甚至把旧贵族关进凡尔赛宫，使这帮人的富贵只能依靠他。对领导人来说，联盟成员的能力不重要甚至反而有害，忠诚才是最重要的。朱元璋为什么要屠戮功臣？就是要削弱联盟的能力，同时证明联盟成员是可替换的。我们完全可以想象中国皇帝的统治之所以稳定，一个很大原因就是通过科举制度扩大了名义选民，让功臣和贵族始终保持一定的不安全感。&lt;/p&gt;
&lt;p&gt;联盟和名义选民的相对大小关系，是政治格局的关键。有没有投票选举，有没有自由媒体，有没有三权分立，有没有监督机制，都是细节而已。只有当联盟人数足够多，成功的民主政治才有可能实现。如果联盟人数少，哪怕在民主国家也会发生独裁式腐败。此书中有个好例子。美国加州贝尔市人口不足四万，经济很差，然而其市长却给自己定了个78万美元的高年薪，其市政委员会成员年薪也有10万— 要知道洛杉矶市长年薪才20万，美国总统才40万，其它地方的市政委员会工资不过每年几千而已。贝尔市长能做到这些，恰恰是其成功设计了一场参加人数很少的投票，把贝尔市从普通城市变成“宪章城市”。这意味着很多事情可以关起门通过少数几个联盟成员自己做。&lt;/p&gt;
&lt;p&gt;国际奥委会和国际足联都是小联盟组织，这就是为什么它们都很腐败，而且它们的主席都能在任很长时间。国际奥委会总共只有115个委员席位，重大决定只需要赢58票。这意味着只要收买少数委员就能在很大程度上左右投票结果，而众所周知奥委会委员在决定奥运举办城市时的确会接受贿赂。据BBC估计现在贿赂奥委会委员的总价码大约不过才一千万美元。国际足联更腐败，你只需要13票！所以贿赂他们一个人需要的钱就更多，据报道有一个委员的亲口开价是单人八百万美元。也只有腐败，才能解释把世界杯主办权交给卡塔尔这样的荒谬决定。其实消除腐败的办法很简单：扩大联盟人数。比如可以给全体奥运会运动员投票权，不过奥委会主席是不会赞成这个建议的。&lt;/p&gt;
&lt;p&gt;上市公司虽然有广大的小股东（名义选民），但是董事会往往只有十几个人。联盟人数极少，对CEO来说是一个容易形成独裁的局面。一般人可能想象CEO的工资应该跟他的业绩密切相关，而据《经济学人》2012年报道的最新统计，CEO工资跟业绩根本没关系！事实上，CEO的最佳策略不是搞业绩而是搞政治。他们必须在董事会安插自己的人马，研究表明越是在董事会有亲信的CEO，他们的在位时间就越长。比如惠普女CEO Carly Fiorina因为行事高调和错误收购康柏，现在已经成了IT史上的笑话，但是她在任内做的每个动作都符合权力规则。Fiorina一上台就不断在董事会排除异己，减少联盟人数。而她不顾市场反对坚决收购康柏，正是为了扩大名义选民，进一步冲淡董事会中对自己的反对势力。然后她给新的董事会加薪，正是收买联盟。当然最后因为惠普的业绩实在太差，股价一跌再跌，Fiorina任职六年后被迫在2005年下台。就是这样她仍然得到一笔巨额遣散费。其实Fiorina被赶下台的关键还是董事们都有股票，他们对股价的关心最终胜过了对Fiorina“喜爱”。我们完全可以设想倘若惠普不是一个公司而是一个国家，也许Fiorina就会在领导人的位置上一直干下去。&lt;/p&gt;
&lt;p&gt;那么在人民享有广泛的投票权，联盟人数理论上可以达到全体选民的一半的民主国家，权力规则是否还起作用呢？答案是民主国家领导人与独裁国家领导人并无本质区别：他们都必须优先保证自己铁杆支持者的利益。&lt;/p&gt;
&lt;p&gt;Bueno de Mesquita提出，当我们谈论民主政治的时候必须了解一点：所谓“国家利益”，其实是个幻觉。国家作为一个抽象概念并没有自己的利益 — 是国家中的不同人群有各自不同的利益。政客们无非是代表一定的利益集团进行博弈而已。因为联盟人数太多，民主国家领导人没有办法直接用钱收买联盟，但是可以给政策。以美国大选为例，奥巴马的铁杆支持者就是穷人，以西裔和黑人为代表的少数民族，年轻人和女人。那么他当选后就一定要把大量税收用于社会福利，加强医保和社区服务。最近罗姆尼败选后就此大大抱怨，但是罗姆尼当选也得回报自己的支持者。美国政界常见的“专项拨款（earmark）”和“猪肉桶（pork barrel）”现象，就是政客回报自己选区的特定选民的手段。《独裁者手册》列举了权力规则在民主国家美国的种种体现：搞集团投票（block voting），国会选举要划分选区，就是为了减少联盟人数；民主党倾向于增加移民并给非法移民大赦，就是要扩大名义选民；两党都特别重视税法，就是要控制钱；民主党搞福利，共和党支持把大量研究经费投入到疑难杂症等往往只对富人有利的研究，就是为了回报各自的联盟；共和党反对给富人加税和医保改革，就是因为绝对不能动自己联盟的利益。美国以外，种种选举中的政治手段也是屡见不鲜。在新加波不给李光耀的党投票的选区的住房计划会被削减；有些国家存在直接买票的情况，而更高级的做法则是哪个村子投给我的票最多，我当选之后就给哪个村修条路。&lt;/p&gt;
&lt;p&gt;有这么一帮人，他们相信民主国家的领导人真心热爱民主，希望能借助外国力量推动国内的民主。这帮人太天真了。民主国家领导人的确要取悦人民，但仅限于其本国的人民。事实上，民主国家领导人在国内处处受限，但在对外政策上却可以像独裁者一样行事。美国总统爱说美国要在世界范围内推进民主，而此书指出，这全是胡扯。美国对外政治的唯一原则是确保美国人的利益。为此美国要求外国政府施行有利于美国的政策。这有两个办法，不常见的办法是战争，常见的办法则是对外“援助”。&lt;/p&gt;
&lt;p&gt;2010年，女经济学家Dambisa Moyo出了一本书，Dead Aid（《援助已死》），列举大量事实证明发达国家对非洲的种种所谓援助，根本没有起到任何正面作用。实际情况是绝大多数援助金额和物资被当地独裁者占有，他们正好可以用这笔收入回报联盟。你想给独裁国家饥民提供直接援助，该国政府会首先要求你交税。然而明知援助无效的情况下，为什么发达国家和国际组织仍然要继续提供援助呢？因为援助的目的本来就是收买独裁政府。援助其实就是一个幌子，就好像以对方小孩上大学为名义的行贿一样，你要当真去考察这钱是不是交了学费就荒唐了。美国曾经通过对埃及援助来促成埃以和谈，埃及政府拿了钱办了事却并未在本国宣传美国的好，埃及老百姓反而更恨美国了。&lt;/p&gt;
&lt;p&gt;Bueno de Mesquita使用一个简单的数学模型证明，越是联盟人数少的国家，它的政府就越容易被收买，因为收买少数人花不了多少钱。同样一笔钱投给民主国家可能什么问题都解决不了，投给独裁国家却可以立即让该国政策发生一个改变 — 所以越是独裁国家，越容易出内奸。给一个独裁国家援助，等于帮着独裁者收买联盟来巩固自己的地位。此书介绍了一个很有意思的研究，统计发现那些当选联合国安理会成员国的国家，在其任期内，经济发展和政治自由都变的更落后了！为什么？因为更大的发言权可以换来更多援助！很明显，这个安理会效应在独裁国家更强。&lt;/p&gt;
&lt;p&gt;从容易收买的角度看，美国领导人更喜欢独裁的外国政府。最近一系列非洲国家民主化以后给美国带来了很大麻烦。在历史上如果一个民选的外国政府对美国人不利，美国甚至可能直接出兵干掉这个民主政府，然后换上一个独裁傀儡，比如智利的皮诺切特。有人可能会说难道美国人民不喜欢推行民主么？没错，但这种喜欢仅限于口头说说，如果你要让他们拿自己的利益换别人的民主，那就不干了。《独裁者手册》生动地说，什么叫民主？民主就是government of, by, and for the people at home。&lt;/p&gt;
&lt;p&gt;尽管此书对美式民主的弊端多有披露，有人对此书的一个批评仍然是其大大美化了美国的民主，而且高估了美国胜利联盟的人数。有研究表明很多美国选民的意志并没有在获胜后得到体现。但不论如何，这本书的基础论述是可取的。在我看来此书并没有把民主神圣化，它只是用一个有点愤世嫉俗的态度告诉读者，独裁体制收买少数人，民主体制收买多数人，本质都是收买。&lt;/p&gt;
&lt;p&gt;我读此书的一个突出感受是民主的本质就是让老百姓过好当前的小日子，而不要谈什么长远目标和伟大理想。有人认为民主是一个手段，其实民主本身就是目的。书中列举好几个研究数据，说明在相似经济发展条件下，民主国家的教育与医疗水平，地震等自然灾害死亡人数，都明显优于独裁国家。一个有意思的统计是越是独裁国家，从首都机场机场到首都市区的公路修得就越直，因为独裁国家征地容易。&lt;/p&gt;
&lt;p&gt;我们甚至可以说民主制度就是一种以满足人民短期利益为目标的福利制度。一个最能说明问题的现象就是所有政府都乐意借钱，因为借钱可以自己花，还钱则是下届政府的事。而且就算你不借钱，你的竞争者也会借钱，还不如你借了钱，给政府负债，反而让竞争者不好接手。政府借来钱不必生利，直接分给联盟收买人心就行。唯一能限制独裁政府借钱的是别人愿意借给他多少钱。唯一能限制民主政府借钱的是他万一还不上债会被降低信用等级。本来经济增长的时候正好还债，但西方政府没有这么做，他们有钱了也不还。当一个政客批评别的政客不顾国家长远利益借钱花，他的实际意思是说怎么这钱不是我借的！&lt;/p&gt;
&lt;p&gt;尽管民主也有很多弊端，它仍然比独裁强得多，绝大多数人恐怕还是宁可生活在一个自由民主的国家里。那么到底怎样才能成为真正的民主国家？民主的一个先决条件是政府必须是人民纳税养活的。如果这个国家拥有石油之类的自然资源，独裁者只需把这个资源控制在手里就能确保足够的收入去喂饱联盟，那么他就任何时候都不需要什么民主。我们现在看缅甸似乎有民主化的迹象，但是按此书分析，缅甸自然资源非常丰富，军政府靠卖资源就能获得巨大收入，在这种情况下想搞民主很难。只有在国家收入必须依赖税收的情况下，独裁者为了获得收入才有可能给人民更多自由，市场经济才有可能。俄罗斯现在民主程度下降，一个重要原因是石油涨价了。此书甚至设想如果当年石油也有这么贵，可能戈尔巴乔夫根本没必要搞改革。&lt;/p&gt;
&lt;p&gt;实行民主的另一个条件是最好在这个国家的建政之初，联盟的人数就比较大。有人把华盛顿施行民主而不称帝归结于他的个人美德，这是大错特错，其实华盛顿哪有称帝的资本！美国建国靠的军事力量本身就是各州组成的一个联盟，根本不是谁一家独大的局面。&lt;/p&gt;
&lt;p&gt;那么现在世界上这些独裁国家，怎样才能过渡到民主呢？一个常见的论点是认为经济发展会带来民主。这个论点的逻辑是说经济发展必然会让人民变得更加自由，而富裕和自由的人民必然会要求更多的民主权利。此书对这个论点不屑一顾。问题是当一个国家的经济增长，其政府的收入也会上升，领导人手里有足够多的钱可以很好地安抚联盟，他日子过得好好的为什么要搞民主？历史的经验表明反而是一个国家经济出现严重问题，乃至于领导人没钱了按不住联盟的时候，这个国家更有可能突然实行民主。从这个角度说经济危机的时候借给独裁者钱，等于帮他维持统治。为什么几年前埃及发生了革命？此书提出这是因为军队没有像以往一样镇压上街群众。而军队之所以旁观是因为穆巴拉克没钱了，联盟感到他已经不能保证自己的利益。穆巴拉克之所以没钱，则是因为正好在经济不行的时刻美国减少了对埃及援助。&lt;/p&gt;
&lt;p&gt;归根结底，民主的本质不是选举，而是联盟人数多。所以民主化的根本办法就是扩大联盟人数。但是这一点不能指望领导人，因为根据权利规则，领导人在任何情况下希望的都是减少联盟人数。而另一方面名义选民则在任何情况下都希望扩大联盟人数。真正能让联盟扩大的，其实是联盟本身。独裁国家的联盟成员本来是不希望联盟扩大的，因为联盟人数越少，每个人能得到的利益就越大。然而人数少也意味着存在不安全感，领导人可以随时替换他们，这还不算在政权更迭的时刻联盟本身能不能继续存在都成问题。这样联盟有可能会乐意增加人数来换取安全感。我们看有人评价前苏联解体是《来自上层的革命》，也许就是这个机制起的作用。&lt;/p&gt;
&lt;p&gt;《独裁者手册》进一步使用了一个相当简陋的数学模型来说明如果联盟人数继续增加，他们反而会因为这个增加而获得经济上的好处。这个模型是这么算的：联盟人数增加意味着国家更民主，于是税率会降低，于是人民会更加乐意工作，于是经济增长，于是每个人的收入都增加。在我看来这个模型相当不可靠，单说“民主国家税率低”这个论点，就让欧洲那些高福利国家情何以堪。&lt;/p&gt;
&lt;p&gt;我想，经济发展带来民主这个论点还是有道理的。正如去年出版的The Rational Optimist（《理性乐观派》）这本大肆鼓吹商品交换带来人类一切好处的书所论证的，所谓民主和法治这些东西，并非是哪个强人自上而下赐予人民的，而是人民在市场交换过程中互相磨合和演化出来的。随着经济发展，国家中会涌现出越来越多的敢于要求更多权利的人来。这些人如果足够多，他们将是所有政党都必须争取的对象。&lt;/p&gt;
&lt;p&gt;他们想加入胜利联盟！&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文来源：&lt;a href=&quot;https://www.geekonomics10000.com/712&quot;&gt;https://www.geekonomics10000.com/712&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E6%94%BE%E8%AF%B8%E5%8F%A4%E4%BB%8A%E7%9A%86%E5%87%86%E7%9A%84%E6%9D%83%E5%8A%9B%E8%A7%84%E5%88%99.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E6%94%BE%E8%AF%B8%E5%8F%A4%E4%BB%8A%E7%9A%86%E5%87%86%E7%9A%84%E6%9D%83%E5%8A%9B%E8%A7%84%E5%88%99.html</guid>
                                               <category>转载</category>
                                    </item>
                <item>
            <title>PHP实现冒泡算法</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: PHP实现冒泡算法
tags: Algorithm
category: PHP
status: publish
summary: PHP实现冒泡算法
--&gt;
&lt;h4&gt;PHP实现冒泡算法&lt;/h4&gt;
&lt;p&gt;给出一组互不相同的数字，然后按照从小到大的顺序排列&lt;/p&gt;
&lt;p&gt;基本思路：
从索引为0的数字开始，和索引为1的数字比较，如果前者比后者大，则相互交换位置，接着索引为1的数字和索引为2的数字比较，以此类推。
当索引为最大的数字和它之前的数字比较之后，则一个循环结束。
在从索引为0开始重复上面的步骤，直到不产生任何位置互换，然后输出排序完成后的数组。&lt;/p&gt;
&lt;h4&gt;实例分析&lt;/h4&gt;
&lt;p&gt;以数组 arr = [5, 1, 4, 2, 8] 为例说明，加粗的数字表示每次循环要比较的两个数字：&lt;/p&gt;
&lt;p&gt;第一次外循环&lt;/p&gt;
&lt;p&gt;( 5 1 4 2 8 ) → ( 1 5 4 2 8 )， 5 &amp;gt; 1 交换位置
( 1 5 4 2 8 ) → ( 1 4 5 2 8 )， 5 &amp;gt; 4 交换位置
( 1 4 5 2 8 ) → ( 1 4 2 5 8 )， 5 &amp;gt; 2 交换位置
( 1 4 2 5 8 ) → ( 1 4 2 5 8 )， 5 &amp;lt; 8 位置不变&lt;/p&gt;
&lt;p&gt;第二次外循环（除开最后一个元素8，对剩余的序列）&lt;/p&gt;
&lt;p&gt;( 1 4 2 5 8 ) → ( 1 4 2 5 8 )， 1 &amp;lt; 4 位置不变
( 1 4 2 5 8 ) → ( 1 2 4 5 8 )， 4 &amp;gt; 2 交换位置
( 1 2 4 5 8 ) → ( 1 2 4 5 8 )， 4 &amp;lt; 5 位置不变&lt;/p&gt;
&lt;p&gt;第三次外循环（除开已经排序好的最后两个元素，可以注意到上面的数组其实已经排序完成，但是程序本身并不知道，所以还要进行后续的循环，直到剩余的序列为 1）&lt;/p&gt;
&lt;p&gt;( 1 2 4 5 8 ) → ( 1 2 4 5 8 )
( 1 2 4 5 8 ) → ( 1 2 4 5 8 )&lt;/p&gt;
&lt;p&gt;第四次外循环（最后一次）
( 1 2 4 5 8 ) → ( 1 2 4 5 8 )&lt;/p&gt;
&lt;p&gt;这个例子主要是展开分析下步骤，演示代码不使用这个示例
上面的例子来源：&lt;a href=&quot;http://bubkoo.com/2014/01/12/sort-algorithm/bubble-sort/&quot;&gt;http://bubkoo.com/2014/01/12/sort-algorithm/bubble-sort/&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;PHP代码实现&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$arr = [4,9,8,6,7,3,1,2];

function bubbleSort($arr){
    $items = count($arr);
    $checkPoint = true;
    while($checkPoint){
        $checkPoint = false;
        for($i=0;$i&amp;lt;$items-1;$i++){
            if($arr[$i]&amp;gt;$arr[$i+1]){
                $tmp = $arr[$i];
                $arr[$i] = $arr[$i+1];
                $arr[$i+1] = $tmp;
                $checkPoint = true;
            }
        }
    }
    return $arr;
}
echo &#039;&amp;lt;pre&amp;gt;&#039;;
print_r(bubbleSort($arr));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的一个重点是不产生任何交换就意味着排序已经完成，如果以此为条件停止循环是关键。&lt;/p&gt;
&lt;p&gt;上面的代码中，创建一个&lt;code&gt;$checkPoint&lt;/code&gt;变量，将它设置为&lt;code&gt;false&lt;/code&gt;，如果有交换产生则将它赋值为&lt;code&gt;true&lt;/code&gt;，没有交换产生了就是默认的&lt;code&gt;false&lt;/code&gt;，那么循环结束。
为了使&lt;code&gt;while&lt;/code&gt;循环能启动，在这之前先将&lt;code&gt;$checkPoint&lt;/code&gt;赋值为&lt;code&gt;true&lt;/code&gt;。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/PHP%E5%AE%9E%E7%8E%B0%E5%86%92%E6%B3%A1%E7%AE%97%E6%B3%95.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/PHP%E5%AE%9E%E7%8E%B0%E5%86%92%E6%B3%A1%E7%AE%97%E6%B3%95.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>Python IP 处理模块</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: Python IP 处理模块
tags: Python,IP,Network
category: Python
status: publish
summary: Python IP 处理模块
--&gt;
&lt;h4&gt;Python IP 处理模块&lt;/h4&gt;
&lt;h4&gt;安装&lt;/h4&gt;
&lt;p&gt;项目官网：&lt;a href=&quot;https://pypi.python.org/pypi/IPy/&quot;&gt;https://pypi.python.org/pypi/IPy/&lt;/a&gt;
下载最新版源码
&lt;code&gt;python setup.py install&lt;/code&gt; 安装&lt;/p&gt;
&lt;h4&gt;使用&lt;/h4&gt;
&lt;p&gt;示例1&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from IPy import IP

ip=IP(&#039;192.168.0.0/28&#039;)
print ip.len()
for x in ip:
    print x&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;16
192.168.0.0
192.168.0.1
192.168.0.2
192.168.0.3
......
192.168.0.15&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例2&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; from IPy import IP
&amp;gt;&amp;gt;&amp;gt; ip_mask = IP(&#039;10.0.0.0&#039;).make_net(&#039;255.255.255.0&#039;)
&amp;gt;&amp;gt;&amp;gt; print ip_mask
10.0.0.0/24
# 也可以
&amp;gt;&amp;gt;&amp;gt; print (IP(&#039;10.0.0.0&#039;).make_net(&#039;255.255.255.0&#039;))
10.0.0.0/24

&amp;gt;&amp;gt;&amp;gt; print (IP(&#039;10.0.0.0/255.255.255.0&#039;,make_net=True))
10.0.0.0/24

&amp;gt;&amp;gt;&amp;gt; print (IP(&#039;10.0.0.0-10.0.0.255&#039;,make_net=True))
10.0.0.0/24&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段。输出类型为字符串，如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; IP(&#039;10.0.1.0/24&#039;).strNormal(0)
&#039;10.0.1.0&#039;
&amp;gt;&amp;gt;&amp;gt; IP(&#039;10.0.1.0/24&#039;).strNormal(1)
&#039;10.0.1.0/24&#039;
&amp;gt;&amp;gt;&amp;gt; IP(&#039;10.0.1.0/24&#039;).strNormal(2)
&#039;10.0.1.0/255.255.255.0&#039;
&amp;gt;&amp;gt;&amp;gt; IP(&#039;10.0.1.0/24&#039;).strNormal(3)
&#039;10.0.1.0-10.0.1.255&#039;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;来源：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.sijitao.net/2447.html&quot;&gt;http://www.sijitao.net/2447.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jianshu.com/p/16d8570b78db&quot;&gt;https://www.jianshu.com/p/16d8570b78db&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Python_IP_%E5%A4%84%E7%90%86%E6%A8%A1%E5%9D%97.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Python_IP_%E5%A4%84%E7%90%86%E6%A8%A1%E5%9D%97.html</guid>
                                               <category>Python</category>
                                    </item>
                <item>
            <title>GoQuiet折腾记</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: GoQuiet折腾记
tags: Linux,Go
category: Linux,Program
status: publish
summary: GoQuiet折腾记
--&gt;
&lt;h4&gt;GoQuiet折腾记&lt;/h4&gt;
&lt;p&gt;GoQuiet 是某S软件的一个插件，用来伪装TLS，使用Go语言开发，心血来潮想用源码编译一下&lt;/p&gt;
&lt;h4&gt;遇到Go的坑&lt;/h4&gt;
&lt;p&gt;VPS用的是阿里云国际版新加坡节点，系统版本是Ubuntu 16.04 64bit
&lt;code&gt;apt-get install&lt;/code&gt;安装的Go版本是1.6，比较老了，想安装最新版，从网上找了很多教程，包括官方文档，编译安装过程中总是需要错误，遂放弃。&lt;/p&gt;
&lt;h4&gt;直接用现成的二进制文件&lt;/h4&gt;
&lt;p&gt;下载地址:&lt;a href=&quot;https://dl.google.com/go/go1.11.linux-amd64.tar.gz&quot;&gt;https://dl.google.com/go/go1.11.linux-amd64.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
tar -zxvf go1.11.linux-amd64.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到&lt;code&gt;go&lt;/code&gt;目录&lt;/p&gt;
&lt;p&gt;添加环境变量&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir $HOME/work
vim ~/.profile
export GOROOT=$HOME/go
export GOPATH=$HOME/work
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试是否成功
&lt;code&gt;go version&lt;/code&gt;
查看是否正确反馈版本信息&lt;/p&gt;
&lt;h4&gt;编译安装GoQuiet&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir -p $GOPATH/src/github.com/cbeuw/
cd $GOPATH/src/github.com/cbeuw/
git clone https://github.com/cbeuw/GoQuiet.git
cd GoQuiet
go build -ldflags &quot;-X main.version=${version}&quot; -o ./build/gq-server ./cmd/gq-server
mv build/gq-* /usr/local/bin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证是否成功&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gq-server -h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;查看是否反馈帮助信息&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-build-go-from-source-on-ubuntu-16-04/&quot;&gt;How To Build Go from Source on Ubuntu 16.04&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jianshu.com/p/5fae045f1b2f&quot;&gt;Ubuntu源码编译安装go语言——墙内版&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gobyexample.com/hello-world&quot;&gt;Go by Example: Hello World&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/GoQuiet%E6%8A%98%E8%85%BE%E8%AE%B0.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/GoQuiet%E6%8A%98%E8%85%BE%E8%AE%B0.html</guid>
                                               <category>Linux</category>
                                   <category>Program</category>
                                    </item>
                <item>
            <title>Xshell密钥登录</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: Xshell密钥登录
tags: Linux,SSH
category: Linux
status: publish
summary: Xshell密钥登录
--&gt;
&lt;h4&gt;Xshell密钥登录&lt;/h4&gt;
&lt;h4&gt;生成密钥&lt;/h4&gt;
&lt;p&gt;点击Xshell菜单栏的工具，选择新建用户密钥生成向导，进行密钥对生成操作。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736599856.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注意Key Type选择RSA，Key Length选择2048，然后选择下一步：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736624712.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待密钥生成成功，然后选择next：&lt;/p&gt;
&lt;p&gt;弹出如下窗口，填写key name，以及key验证时的密码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736647262.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击下一步，将公钥进行保存（下面会将公钥传到服务器上）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736664254.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是私钥，以后用私钥进行登录，可以将私钥导出保存：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736691003.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;到这里生成密钥就已经完成&lt;/p&gt;
&lt;h4&gt;将生成的密钥放到server&lt;/h4&gt;
&lt;p&gt;点击新建，输入地址连接主机&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736725292.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确定之后点击连接&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736739102.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;CentOS用户名为&lt;code&gt;root&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736753123.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入密码完成连接&lt;/p&gt;
&lt;p&gt;运行&lt;code&gt;rz&lt;/code&gt;命令(如果没有&lt;code&gt;rz&lt;/code&gt;命令，运行&lt;code&gt;yum install lrzsz&lt;/code&gt;安装，输入两次y确认)&lt;/p&gt;
&lt;p&gt;将密钥文件上传到server之后，需要做如下操作，&lt;/p&gt;
&lt;p&gt;把&lt;code&gt;kectest.pub&lt;/code&gt;的内容替换到&lt;code&gt;/root/.ssh/&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ls -a 

mkdir .ssh
 chmod 700 .ssh/
 cd .ssh/
 cat ../img/kectest.pub &amp;gt; ./img/authorized_keys
 ls
chmod 600 authorized_keys&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736844903.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;配置server的ssh服务&lt;/h4&gt;
&lt;p&gt;只允许使用密钥登录不允许口令登录，使用&lt;code&gt;vim&lt;/code&gt;(如果没有&lt;code&gt;vim&lt;/code&gt;则先要运行&lt;code&gt;yum -y install vim&lt;/code&gt;安装。)输入：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vim /etc/ssh/sshd_config&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;点击键盘“i”进入编辑，进行如下修改&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;PasswordAuthentication no     //yes改为no  
ChallengeResponseAuthentication no  //yes改为no  

RSAAuthentication yes   //去掉前面的注释  
PubkeyAuthentication yes  //去掉前面的注释  
AuthorizedKeysFile .ssh/authorized_keys  //去掉前面的注释  &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如图：
将&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736955205.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;改为&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528736969964.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按Esc键退出编辑
输入：：wqEnter一下保存退出。
重启sshd：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;service sshd restart&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528737003827.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;到这里所有的配置均已完成。&lt;/p&gt;
&lt;h4&gt;重新连接登录验证&lt;/h4&gt;
&lt;p&gt;如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528737040064.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Password已经变灰，不能编辑，只能通过密钥登录，这时选择当初生成的密钥点击确定即可登录成功。&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/Xshell%E5%AF%86%E9%92%A5%E7%99%BB%E5%BD%95.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/Xshell%E5%AF%86%E9%92%A5%E7%99%BB%E5%BD%95.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>网卡和bond解除关联</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: 网卡和bond解除关联
tags: Linux
category: Linux
status: publish
summary: 网卡和bond解除关联
--&gt;
&lt;h4&gt;网卡和bond解除关联&lt;/h4&gt;
&lt;h4&gt;查看所有网卡信息&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ip link show&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1533275812630.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里的图片是参考，如果做了 bond 组会显示 bond 信息&lt;/p&gt;
&lt;h4&gt;ifenslave 命令&lt;/h4&gt;
&lt;p&gt;将网口添加到bond中：&lt;code&gt;ifenslave bond eth0 eth1&lt;/code&gt;（bond要先up）
将bond中删除网口：&lt;code&gt;ifenslave -d bond eth0&lt;/code&gt;
bond中网口主备倒换：&lt;code&gt;ifenslave -c bond eth1&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.51cto.com/lixin15/1769338&quot;&gt;http://blog.51cto.com/lixin15/1769338&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.sina.com.cn/s/blog_642e41c20101tcu9.html&quot;&gt;http://blog.sina.com.cn/s/blog_642e41c20101tcu9.html&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E7%BD%91%E5%8D%A1%E5%92%8Cbond%E8%A7%A3%E9%99%A4%E5%85%B3%E8%81%94.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E7%BD%91%E5%8D%A1%E5%92%8Cbond%E8%A7%A3%E9%99%A4%E5%85%B3%E8%81%94.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>如何为 Windows 10 UWP 应用设置代理</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: 如何为 Windows 10 UWP 应用设置代理
tags: Windows
category: Windows
status: publish
summary: 如何为 Windows 10 UWP 应用设置代理
--&gt;
&lt;h4&gt;如何为 Windows 10 UWP 应用设置代理&lt;/h4&gt;
&lt;p&gt;UWP 是微软在 Windows 10 中引入的新概念，由于所有 UWP 应用均运行在被称为 App Container 的虚拟沙箱环境中，其安全性及纯净度远胜于传统的 EXE 应用。但 App Container 机制同时也阻止了网络流量发送到本机（即 loopback）， 使大部分网络抓包调试工具无法对 UWP 应用进行流量分析。同样的，该机制也阻止了 UWP 应用访问 localhost，即使你在系统设置中启用了代理，也无法令 UWP 应用访问本地代理服务器，十分恼人。&lt;/p&gt;
&lt;p&gt;其实 Windows 10 自带了一款名为 CheckNetIsolation.exe 的命令行工具可以帮助我们将 UWP 及 Windows 8 Metro 应用添加到排除列表，具体步骤如下：&lt;/p&gt;
&lt;h4&gt;1.通过注册表获取应用的 SID&lt;/h4&gt;
&lt;p&gt;首先通过 Win + R 快捷键打开「运行」窗口，输入「Regedit」打开注册表编辑器，然后定位到 &lt;code&gt;HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Mappings&lt;/code&gt;，接着在左边的注册表项中找到你想解除网络隔离的应用，右边的 DisplayName 就是应用名称，而左边那一大串字符就是应用的 SID 值了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536028348129.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;2.以管理员权限运行CMD&lt;/h4&gt;
&lt;p&gt;在终端中输入 CheckNetIsolation.exe loopbackexempt -a -p=SID，出现「完成」后就大功告成了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1536028389312.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;3.清除规则&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;C:\Windows\system32&amp;gt;CheckNetIsolation.exe loopbackexempt
错误: 参数无效

用法:
   CheckNetIsolation LoopbackExempt [operation] [-n=] [-p=]
      操作列表:
          -a  -  向环回免除列表中添加 AppContainer 或程序包系列。
          -d  -  从环回免除列表中删除 AppContainer 或程序包系列。
          -c  -  清除环回免除的 AppContainer 和程序包系列的列表。
          -s  -  显示环回免除的 AppContainer 和程序包系列的列表。

      参数列表:
          -n= - AppContainer 名称或程序包系列名称。
          -p= - AppContainer 或程序包系列安全标识符(SID)。
          -?  - 显示 LoopbackExempt 模块的此帮助消息。
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：&lt;a href=&quot;https://zhuanlan.zhihu.com/p/29989157&quot;&gt;https://zhuanlan.zhihu.com/p/29989157&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E5%A6%82%E4%BD%95%E4%B8%BA_Windows_10_UWP_%E5%BA%94%E7%94%A8%E8%AE%BE%E7%BD%AE%E4%BB%A3%E7%90%86.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E5%A6%82%E4%BD%95%E4%B8%BA_Windows_10_UWP_%E5%BA%94%E7%94%A8%E8%AE%BE%E7%BD%AE%E4%BB%A3%E7%90%86.html</guid>
                                               <category>Windows</category>
                                    </item>
                <item>
            <title>Windows下搭建seafile服务器，拥有自己的个人云盘</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: Windows下搭建seafile服务器，拥有自己的个人云盘
tags: Windows
category: Windows
status: publish
summary: Windows下搭建seafile服务器，拥有自己的个人云盘
--&gt;
&lt;h4&gt;Windows下搭建seafile服务器，拥有自己的个人云盘&lt;/h4&gt;
&lt;p&gt;系统：Windows 2008R2
软件：Python 2.7.11 32 位版本(一定要使用 Python 2.7.11 32 位版本。64 位版本或不是 2.7.11 的版本不能工作。)&lt;/p&gt;
&lt;h4&gt;安装Python&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528946822016.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;配置python环境变量：
右击这台电脑—属性—高级系统设置，找到环境变量&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528946844568.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528946853269.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528946863301.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;python&lt;/code&gt;默认安装在&lt;code&gt;C:\Python27&lt;/code&gt;路径下，那么就将&lt;code&gt;C:\Python27&lt;/code&gt;添加到环境变量中。&lt;/p&gt;
&lt;p&gt;如果安装过程中报错&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528946906119.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载安装Microsoft Visual C++ 2008 SP1 Redistributable Package (x86) 解决问题。地址：&lt;a href=&quot;http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=5582&quot;&gt;http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=5582&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;安装seafile服务&lt;/h4&gt;
&lt;p&gt;创建&lt;code&gt;SeafileProgram&lt;/code&gt;文件夹，将&lt;code&gt;seafile-server_6.0.7_win32.tar.gz&lt;/code&gt;解压到此目录下，目录结构&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SeafileProgram
         |---seafile-server-5.0.3&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;启动 Seafile 服务器&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;\SeafileProgram\seafile-server-5.0.3\&lt;/code&gt;文件夹下，找到&lt;code&gt;run.bat&lt;/code&gt;文件并双击，以启动 Seafile 服务器。此时，您应该注意到 Seafile 服务器的图标已经出现在您的系统托盘中。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528947207006.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择一个磁盘作为 Seafile 服务器数据的存储位置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528947222048.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528947230362.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击确认按钮后， Seafile 将会在刚才选择的磁盘下创建一个名为seafile-server的文件夹。这个文件夹就是 Seafile 服务器的数据文件夹。&lt;/p&gt;
&lt;h5&gt;添加管理员帐号&lt;/h5&gt;
&lt;p&gt;右击 Seafile 服务器的系统托盘图标，选择&amp;quot;添加管理员帐号&amp;quot;选项。在弹出的对话框中输入您的管理员用户名和密码。如果操作成功， Seafile 服务器托盘图标处会弹出一个气泡提示您&amp;quot;添加 Seahub 管理员账户成功&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528947304439.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528947311846.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;h5&gt;配置Seafile 服务器&lt;/h5&gt;
&lt;p&gt;输入&lt;code&gt;http://localhost:8000/&lt;/code&gt;打开网盘&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528947380637.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;若要外网访问，直接将内网端口对应映射到外网端口，
&lt;code&gt;SERVICE_URL&lt;/code&gt;和&lt;code&gt;FILE_SERVER_ROOT&lt;/code&gt;设置为：&lt;code&gt;http://外网IP:8000&lt;/code&gt;和&lt;code&gt;http://外网IP:8002&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;安装 Seafile 为Windows 服务&lt;/h5&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528947435755.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528947441689.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1528947446717.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;设置邮件提醒：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;在seadfile-server/conf/seahub_settings.py文件中添加一下内容：

63e28c2905f267bab809b59196bca764.png-wh_

企业邮箱：

EMAIL_HOST =&#039;**.**.2*1.38&#039;      

EMAIL_HOST_USER =&#039;***&#039;  

EMAIL_HOST_PASSWORD= &#039;******&#039;  

EMAIL_PORT = &#039;25&#039;

DEFAULT_FROM_EMAIL= &#039;***@***.**.**&#039;

SERVER_EMAIL =DEFAULT_FROM_EMAIL

REPLACE_FROM_EMAIL= True

ADD_REPLY_TO_HEADER= True

QQ邮箱：

EMAIL_USE_SSL =True

EMAIL_HOST =&#039;smtp.qq.com&#039;

EMAIL_HOST_USER =&#039;11111111@qq.com&#039;

EMAIL_HOST_PASSWORD= &#039;*****unhmifyebfj&#039;

EMAIL_PORT = &#039;465&#039;

DEFAULT_FROM_EMAIL= EMAIL_HOST_USER

SERVER_EMAIL =EMAIL_HOST_USER

注：&#039;*****unhmifyebfj&#039;为QQ邮箱的授权码，到QQ邮箱中获取。
&lt;/code&gt;&lt;/pre&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/windows%E4%B8%8B%E6%90%AD%E5%BB%BAseafile%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E6%8B%A5%E6%9C%89%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%AA%E4%BA%BA%E4%BA%91%E7%9B%98.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/windows%E4%B8%8B%E6%90%AD%E5%BB%BAseafile%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E6%8B%A5%E6%9C%89%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%AA%E4%BA%BA%E4%BA%91%E7%9B%98.html</guid>
                                               <category>Windows</category>
                                    </item>
                <item>
            <title>Ubuntu 16.10/17.10无法通过/etc/rc.local开机启动应用</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: Ubuntu 16.10/17.10无法通过/etc/rc.local开机启动应用
tags: Linux,Ubuntu
category: Linux
status: publish
summary: Ubuntu 16.10/17.10无法通过/etc/rc.local开机启动应用
--&gt;
&lt;h4&gt;Ubuntu 16.10/17.10无法通过/etc/rc.local开机启动应用&lt;/h4&gt;
&lt;p&gt;最新的Ubuntu 16.10/17.10上已经找不到&lt;code&gt;/etc/rc.local&lt;/code&gt;这个文件了。但是我们很多配置都是写在这个文件里面的，因此如果直接按照systemd配置服务的话，需要修改很多。这里我们使用一个比较简单的兼容方案。&lt;/p&gt;
&lt;h4&gt;创建systemd的服务脚本&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vim /etc/systemd/system/rc-local.service

[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;激活服务&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;systemctl enable rc-local.service&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;手动创建 &lt;code&gt;/etc/rc.local&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will &quot;exit 0&quot; on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exit 0&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;给予脚本执行权限&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;chmod +x /etc/rc.local&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：
&lt;a href=&quot;https://www.mobibrw.com/2017/9890&quot;&gt;Ubuntu 16.10/17.10无法通过/etc/rc.local开机启动应用&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vpsfix.com/community/server-administration/no-etc-rc-local-file-on-ubuntu-18-04-heres-what-to-do/&quot;&gt;No /etc/rc.local file on Ubuntu 18.04? Here&#039;s what to do...  &lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/rc.local%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8%E5%BA%94%E7%94%A8.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/rc.local%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8%E5%BA%94%E7%94%A8.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>使用Google Authenticator配置SSH两部验证</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-06
title: 使用Google Authenticator配置SSH两部验证
tags: SSH,Two-step-verification
category: Linux
status: publish
summary: 使用Google Authenticator配置SSH两部验证
--&gt;
&lt;h4&gt;使用Google Authenticator配置SSH两部验证&lt;/h4&gt;
&lt;h4&gt;安装Google Authenticator&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ apt-get update
$ apt-get install libpam-google-authenticator
$ google-authenticator

Do you want authentication tokens to be time-based (y/n) y # 确认：基于时间的认证token 这里会显示生成二维码的地址、二维码、密钥明文、应急码

Do you want me to update your &quot;~/.google_authenticator&quot; file (y/n) y # 确认：更新配置文件

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) n

If the computer that you are logging into isn&#039;t hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;配置openssh&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;vim /etc/pam.d/sshd&lt;/code&gt;
Add the following line to the bottom of the file.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/etc/pam.d/sshd
. . .
# Standard Un*x password updating.
include common-password
&lt;code&gt;auth required pam_google_authenticator.so&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;保存并关闭&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vim /etc/ssh/sshd_config&lt;/code&gt;
Look for &lt;code&gt;ChallengeResponseAuthentication&lt;/code&gt; and set its value to yes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/etc/ssh/sshd_config
. . .
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
&lt;code&gt;ChallengeResponseAuthentication yes&lt;/code&gt;
. . .&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;保存并关闭&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/init.d/ssh restart&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;尝试登录&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ssh localhost -p port&lt;/code&gt;
password: 【输入密码】
verification code: 【输入验证码】&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文参考&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-set-up-multi-factor-authentication-for-ssh-on-ubuntu-16-04&quot;&gt;How To Set Up Multi-Factor Authentication for SSH on Ubuntu 16.04&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.felix021.com/blog/read.php?2133&quot;&gt;为SSH添加两步验证&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8Google_Authenticator%E9%85%8D%E7%BD%AESSH%E4%B8%A4%E9%83%A8%E9%AA%8C%E8%AF%81.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8Google_Authenticator%E9%85%8D%E7%BD%AESSH%E4%B8%A4%E9%83%A8%E9%AA%8C%E8%AF%81.html</guid>
                                               <category>Linux</category>
                                    </item>
                <item>
            <title>使用 gitblog 搭建静态网站</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-05
title: 使用 gitblog 搭建静态网站
tags: gitblog,nginx,php.ini
category: PHP
status: publish
summary: 使用 gitblog 搭建静态网站
--&gt;
&lt;h4&gt;使用 gitblog 搭建静态网站&lt;/h4&gt;
&lt;p&gt;VPS系统 Ubuntu 18.04，PHP 版本 7.2&lt;/p&gt;
&lt;h4&gt;安装 nginx php-fpm mbstring 扩展库&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;apt-get update&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;apt-get install nginx php-fpm php7.2-mbstring -y&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;配置 nginx.conf&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;server {
        listen       80;
        server_name  jockchou.gitblog.cn;
        root         /var/www/;
        index        index.html index.htm index.php;

        location ~ \.(jpg|png|gif|js|css|swf|flv|ico)$ {
                 expires 12h;
        }

        location / {
                if (!-e $request_filename) {
                    rewrite ^(.*)$ /index.php?$1 last ;
                    break;
                }
        }

        location ~* ^/(doc|logs|app|sys)/ {
                return 403;
        }

        location ~ .*\.(php|php5)?$
        {
                fastcgi_connect_timeout 300;
                fastcgi_send_timeout 300;
                fastcgi_read_timeout 300;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include        fastcgi_params;
        }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将以上配置中的&lt;code&gt;server_name&lt;/code&gt;和&lt;code&gt;root&lt;/code&gt;改成你自己的，&lt;code&gt;fastcgi_pass&lt;/code&gt;配成你的CGI进程端口&lt;/p&gt;
&lt;p&gt;配置 php-fpm
&lt;code&gt;vim /etc/php/7.2/fpm/pool.d/www.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;默认设置&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# Stuff omitted
listen = /var/run/php5-fpm.sock&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是说 php-fpm 运行时使用的是 Unix Sockets 套接字，需要改成 TCP  Sockets 才能让nginx接收到&lt;/p&gt;
&lt;p&gt;将&lt;code&gt;www.conf&lt;/code&gt;相关地方改为以下内容&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# Listen on localhost port 9000
listen = 127.0.0.1:9000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;/etc/php/7.2/fpm/php.ini&lt;/code&gt;文件中开启短标签支持
&lt;code&gt;short_open_tag = On&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;重启 nginx php-fpm 服务&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/init.d/nginx restart&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;service php7.2-fpm restart&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在网站根目录下写一个&lt;code&gt;index.php&lt;/code&gt;文件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?
echo(&quot;hello world&quot;);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在浏览器中访问域名正常显示 hello world 表示安装环境成功了&lt;/p&gt;
&lt;h4&gt;安装gitblog&lt;/h4&gt;
&lt;p&gt;到&lt;a href=&quot;https://github.com/jockchou/gitblog/releases&quot;&gt;这里&lt;/a&gt;下载最新的GitBlog源码包，下传到你的服务器，解压复制包中的所有文件到网站根目录，再访问域名，就能看到GitBlog的默认页面了&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文大致参考gitblog文档编写，加入了安装gitblog之前的细节工作，仅供参考&lt;/p&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jockchou/gitblogdoc&quot;&gt;gitblog文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/47752633/failed-to-restart-php-fpm-service-unit-php-fpm-service-not-found&quot;&gt;Failed to restart php-fpm.service: Unit php-fpm.service not found&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://serversforhackers.com/c/php-fpm-configuration-the-listen-directive&quot;&gt;PHP-FPM: Configuration the Listen Directive&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8_gitblog_%E6%90%AD%E5%BB%BA%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/%E4%BD%BF%E7%94%A8_gitblog_%E6%90%AD%E5%BB%BA%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99.html</guid>
                                               <category>PHP</category>
                                    </item>
                <item>
            <title>phpStudy 创建多个站点，绑定域名</title>
            <description>
            &lt;!--
author: admin
date: 2019-02-05
title: phpStudy 创建多个站点，绑定域名
tags: phpStudy,多站点,域名
category: Program
status: publish
summary: phpStudy 创建多个站点，绑定域名
--&gt;
&lt;h4&gt;phpStudy 创建多个站点，绑定域名&lt;/h4&gt;
&lt;p&gt;默认情况下，phpStudy 的站点根目录是在它自己的WWW目录，比如 F:\phpStudy\WWW，访问的地址可以是http://127.0.0.1/或http://localhost/&lt;/p&gt;
&lt;p&gt;下面我们要实现的是创建多个站点，绑定各自的域名，这样就方便我们进行多个项目的开发，互不影响。&lt;/p&gt;
&lt;p&gt;打开&lt;code&gt;apache的httpd.conf&lt;/code&gt;文件,找到&lt;code&gt;# Virtual hosts&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#Include conf/extra/httpd-vhosts.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这一段把&lt;code&gt;Include conf/extra/httpd-vhosts.conf&lt;/code&gt;前面的&amp;quot;#&amp;quot;去掉。&lt;/p&gt;
&lt;p&gt;打开 phpStudy ，在“其他选项”那里点击“站点域名设置”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1548811624964.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;看到如下界面，填写网站域名（随意写，建议不要写你经常访问的线上域名），然后选择网站目录（可以随意目录，但是不要使用中文），然后点击【新增】，然后点击【保存设置并生成配置文件】，重启环境就可以生效了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1548811649296.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上面我们填写的域名，我们希望是直接访问我们本地的网站，要实现这个目的，我们需要修改一下自己电脑里的 hosts 文件，将域名指定到 127.0.0.1 ，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./img/1548811669187.png&quot; alt=&quot;Alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;到这里就万事OK啦！&lt;/p&gt;
&lt;p&gt;注意：
When you create Virtual Hosts Apache ignores the host defined in httpd.conf so you also need to create a Virtual Host for localhost. This explains why you cannot get to localhost when you have activated Virtual Hosts.&lt;/p&gt;
&lt;p&gt;当你创建了虚拟主机后，Apache 会忽略 httpd.conf 中定义的主机，所以你需要为 localhost 创建一个虚拟站点。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;参考资料：
&lt;a href=&quot;https://www.jianshu.com/p/1febcbca051a&quot;&gt;phpStudy 创建多个站点，绑定域名&lt;/a&gt;&lt;/p&gt;            </description>
            <pubDate>2026-04-30 11:54:47</pubDate>
            <link>https://www.syuez.com/blog/phpStudy_%E5%88%9B%E5%BB%BA%E5%A4%9A%E4%B8%AA%E7%AB%99%E7%82%B9%EF%BC%8C%E7%BB%91%E5%AE%9A%E5%9F%9F%E5%90%8D.html</link>
            <guid isPermaLink="true">https://www.syuez.com/blog/phpStudy_%E5%88%9B%E5%BB%BA%E5%A4%9A%E4%B8%AA%E7%AB%99%E7%82%B9%EF%BC%8C%E7%BB%91%E5%AE%9A%E5%9F%9F%E5%90%8D.html</guid>
                                               <category>Program</category>
                                    </item>
            </channel>
</rss>